pi-harness-runtime 1.1.49 → 1.1.71-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 (203) hide show
  1. package/CHANGELOG.md +30 -9
  2. package/README.md +119 -0
  3. package/harness/langchain/agents.d.ts +143 -0
  4. package/harness/langchain/agents.test.d.ts +2 -0
  5. package/harness/langchain/agents.test.ts +0 -1
  6. package/harness/langchain/agents.ts +196 -13
  7. package/harness/langchain/checkpointer.d.ts +48 -0
  8. package/harness/langchain/checkpointer.test.d.ts +8 -0
  9. package/harness/langchain/cron-cli.d.ts +12 -0
  10. package/harness/langchain/cron-cli.ts +169 -0
  11. package/harness/langchain/daemon.d.ts +161 -0
  12. package/harness/langchain/daemon.test.d.ts +11 -0
  13. package/harness/langchain/daemon.test.ts +62 -5
  14. package/harness/langchain/daemon.ts +231 -12
  15. package/harness/langchain/file-tools.d.ts +97 -0
  16. package/harness/langchain/file-tools.ts +29 -11
  17. package/harness/langchain/graph.d.ts +706 -0
  18. package/harness/langchain/graph.ts +184 -26
  19. package/harness/langchain/model-router.d.ts +63 -0
  20. package/harness/langchain/model-router.test.d.ts +2 -0
  21. package/harness/langchain/model-router.test.ts +191 -0
  22. package/harness/langchain/model-router.ts +188 -0
  23. package/harness/langchain/models.d.ts +72 -0
  24. package/harness/langchain/models.ts +111 -49
  25. package/harness/langchain/ping-pong-middleware.d.ts +28 -0
  26. package/harness/langchain/ping-pong-middleware.test.d.ts +2 -0
  27. package/harness/langchain/ping-pong-middleware.test.ts +69 -0
  28. package/harness/langchain/ping-pong-middleware.ts +204 -0
  29. package/harness/langchain/run.d.ts +15 -0
  30. package/harness/langchain/run.ts +15 -3
  31. package/harness/langchain/scoreboard.test.d.ts +13 -0
  32. package/harness/langchain/scoreboard.test.ts +28 -5
  33. package/harness/langchain/status-line.d.ts +91 -0
  34. package/harness/langchain/status-line.test.d.ts +8 -0
  35. package/harness/langchain/surge.d.ts +103 -0
  36. package/harness/langchain/surge.test.d.ts +10 -0
  37. package/harness/langchain/surge.test.ts +179 -0
  38. package/harness/langchain/surge.ts +188 -19
  39. package/harness/langchain/widget.d.ts +105 -0
  40. package/harness/langchain/widget.test.d.ts +8 -0
  41. package/harness/ssh-detach-interceptor.test.ts +263 -0
  42. package/harness/ssh-detach-interceptor.ts +438 -0
  43. package/index.ts +212 -47
  44. package/package.json +4 -2
  45. package/packages/a2a-adapter/package.json +1 -1
  46. package/packages/architecture-generator/package.json +1 -1
  47. package/packages/auth/package.json +1 -1
  48. package/packages/autonomous-refactor/package.json +1 -1
  49. package/packages/autonomous-runtime/package.json +1 -1
  50. package/packages/cache-strategy/package.json +1 -1
  51. package/packages/capability-registry/package.json +1 -1
  52. package/packages/checkpoint/package.json +1 -1
  53. package/packages/cli-plugin-sdk/package.json +1 -1
  54. package/packages/clipboard/package.json +1 -1
  55. package/packages/clipboard-plugin/package.json +1 -1
  56. package/packages/code-generation/package.json +1 -1
  57. package/packages/code-review/package.json +1 -1
  58. package/packages/codex-adapter/package.json +1 -1
  59. package/packages/config-capture/package.json +1 -1
  60. package/packages/context-compiler/package.json +1 -1
  61. package/packages/context-discovery/package.json +1 -1
  62. package/packages/context-manager/package.json +1 -1
  63. package/packages/cookie-sanitizer/package.json +1 -1
  64. package/packages/cost-optimizer/package.json +1 -1
  65. package/packages/dependency-analyzer/package.json +1 -1
  66. package/packages/django-plugin/package.json +1 -1
  67. package/packages/doc-generator/package.json +1 -1
  68. package/packages/evaluation-engine/package.json +1 -1
  69. package/packages/evaluation-runner/package.json +1 -1
  70. package/packages/event-bus/package.json +1 -1
  71. package/packages/event-store/package.json +1 -1
  72. package/packages/experience-replay/package.json +1 -1
  73. package/packages/feedback-collector/package.json +1 -1
  74. package/packages/file-copy-helper/package.json +1 -1
  75. package/packages/framework-detector/package.json +1 -1
  76. package/packages/framework-plugin-sdk/package.json +1 -1
  77. package/packages/frappe-plugin/package.json +1 -1
  78. package/packages/generic-web-plugin/package.json +1 -1
  79. package/packages/health-monitor/package.json +1 -1
  80. package/packages/intent-analyzer/dist/src/index.d.ts +2 -0
  81. package/packages/intent-analyzer/dist/src/index.d.ts.map +1 -1
  82. package/packages/intent-analyzer/dist/src/index.js +1 -0
  83. package/packages/intent-analyzer/dist/src/index.js.map +1 -1
  84. package/packages/intent-analyzer/dist/src/ping-pong.d.ts +56 -0
  85. package/packages/intent-analyzer/dist/src/ping-pong.d.ts.map +1 -0
  86. package/packages/intent-analyzer/dist/src/ping-pong.js +286 -0
  87. package/packages/intent-analyzer/dist/src/ping-pong.js.map +1 -0
  88. package/packages/intent-analyzer/package.json +1 -1
  89. package/packages/intent-analyzer/src/index.ts +13 -0
  90. package/packages/intent-analyzer/src/ping-pong.ts +387 -0
  91. package/packages/intent-analyzer/test/ping-pong.test.ts +96 -0
  92. package/packages/jev-judge/README.md +234 -0
  93. package/packages/jev-judge/dist/decision-engine.d.ts +100 -0
  94. package/packages/jev-judge/dist/decision-engine.d.ts.map +1 -0
  95. package/packages/jev-judge/dist/decision-engine.js +151 -0
  96. package/packages/jev-judge/dist/decision-engine.js.map +1 -0
  97. package/packages/jev-judge/dist/e2e-judge.d.ts +61 -0
  98. package/packages/jev-judge/dist/e2e-judge.d.ts.map +1 -0
  99. package/packages/jev-judge/dist/e2e-judge.js +268 -0
  100. package/packages/jev-judge/dist/e2e-judge.js.map +1 -0
  101. package/packages/jev-judge/dist/flaky-detector.d.ts +34 -0
  102. package/packages/jev-judge/dist/flaky-detector.d.ts.map +1 -0
  103. package/packages/jev-judge/dist/flaky-detector.js +154 -0
  104. package/packages/jev-judge/dist/flaky-detector.js.map +1 -0
  105. package/packages/jev-judge/dist/index.d.ts +77 -0
  106. package/packages/jev-judge/dist/index.d.ts.map +1 -0
  107. package/packages/jev-judge/dist/index.js +271 -0
  108. package/packages/jev-judge/dist/index.js.map +1 -0
  109. package/packages/jev-judge/dist/types.d.ts +97 -0
  110. package/packages/jev-judge/dist/types.d.ts.map +1 -0
  111. package/packages/jev-judge/dist/types.js +8 -0
  112. package/packages/jev-judge/dist/types.js.map +1 -0
  113. package/packages/jev-judge/package.json +46 -0
  114. package/packages/jev-judge/src/decision-engine.ts +231 -0
  115. package/packages/jev-judge/src/e2e-judge.ts +364 -0
  116. package/packages/jev-judge/src/flaky-detector.ts +190 -0
  117. package/packages/jev-judge/src/index.ts +345 -0
  118. package/packages/jev-judge/src/types.ts +131 -0
  119. package/packages/knowledge-graph/package.json +1 -1
  120. package/packages/knowledge-retrieval/package.json +1 -1
  121. package/packages/laravel-plugin/package.json +1 -1
  122. package/packages/learning-engine/package.json +1 -1
  123. package/packages/mcp-adapter/package.json +1 -1
  124. package/packages/memory-engine/package.json +1 -1
  125. package/packages/milestone-manager/package.json +1 -1
  126. package/packages/model-registry/package.json +1 -1
  127. package/packages/nextjs-plugin/package.json +1 -1
  128. package/packages/notification/package.json +1 -1
  129. package/packages/observability/package.json +1 -1
  130. package/packages/okf-indexer/package.json +1 -1
  131. package/packages/performance-optimizer/package.json +1 -1
  132. package/packages/privilege-broker/package.json +1 -1
  133. package/packages/project-analyzer/package.json +1 -1
  134. package/packages/project-bootstrap/package.json +1 -1
  135. package/packages/projection-engine/package.json +1 -1
  136. package/packages/prompt-compiler/package.json +1 -1
  137. package/packages/prompt-versioning/package.json +1 -1
  138. package/packages/provider-adapter-sdk/package.json +1 -1
  139. package/packages/provider-router/package.json +1 -1
  140. package/packages/provider-selector/package.json +1 -1
  141. package/packages/providers/package.json +1 -1
  142. package/packages/quota-manager/package.json +1 -1
  143. package/packages/rate-limiter/package.json +1 -1
  144. package/packages/react-vite-plugin/package.json +1 -1
  145. package/packages/release-manager/package.json +1 -1
  146. package/packages/requirement-compiler/package.json +1 -1
  147. package/packages/runtime/package.json +1 -1
  148. package/packages/scheduler/package.json +1 -1
  149. package/packages/scheduler-adapter/package.json +1 -1
  150. package/packages/session/package.json +1 -1
  151. package/packages/session-api/package.json +1 -1
  152. package/packages/session-export/package.json +1 -1
  153. package/packages/shared-context/package.json +1 -1
  154. package/packages/skill-mcp-client/package.json +1 -1
  155. package/packages/skill-registry/package.json +1 -1
  156. package/packages/sprint-planner/package.json +1 -1
  157. package/packages/subscription-engine/package.json +1 -1
  158. package/packages/task-compiler/package.json +1 -1
  159. package/packages/tencentdb-memory/package.json +1 -1
  160. package/packages/tencentdb-sync/package.json +1 -1
  161. package/packages/test-data-generator/package.json +1 -1
  162. package/packages/test-generator/package.json +1 -1
  163. package/packages/todo-bd-sync/README.md +71 -0
  164. package/packages/todo-bd-sync/package.json +1 -1
  165. package/packages/todo-bd-sync/src/extension.ts +16 -1
  166. package/packages/token-estimation/package.json +1 -1
  167. package/packages/token-optimizer/package.json +1 -1
  168. package/packages/trajectory/dist/src/approved-patterns.d.ts +51 -0
  169. package/packages/trajectory/dist/src/approved-patterns.d.ts.map +1 -0
  170. package/packages/trajectory/dist/src/approved-patterns.js +134 -0
  171. package/packages/trajectory/dist/src/approved-patterns.js.map +1 -0
  172. package/packages/trajectory/dist/src/index.d.ts +13 -0
  173. package/packages/trajectory/dist/src/index.d.ts.map +1 -0
  174. package/packages/trajectory/dist/src/index.js +12 -0
  175. package/packages/trajectory/dist/src/index.js.map +1 -0
  176. package/packages/trajectory/dist/src/store.d.ts +69 -0
  177. package/packages/trajectory/dist/src/store.d.ts.map +1 -0
  178. package/packages/trajectory/dist/src/store.js +253 -0
  179. package/packages/trajectory/dist/src/store.js.map +1 -0
  180. package/packages/trajectory/dist/src/types.d.ts +73 -0
  181. package/packages/trajectory/dist/src/types.d.ts.map +1 -0
  182. package/packages/trajectory/dist/src/types.js +9 -0
  183. package/packages/trajectory/dist/src/types.js.map +1 -0
  184. package/packages/trajectory/dist/test/store.test.d.ts +2 -0
  185. package/packages/trajectory/dist/test/store.test.d.ts.map +1 -0
  186. package/packages/trajectory/dist/test/store.test.js +228 -0
  187. package/packages/trajectory/dist/test/store.test.js.map +1 -0
  188. package/packages/trajectory/package.json +29 -0
  189. package/packages/trajectory/src/approved-patterns.ts +180 -0
  190. package/packages/trajectory/src/index.ts +26 -0
  191. package/packages/trajectory/src/store.ts +285 -0
  192. package/packages/trajectory/src/types.ts +84 -0
  193. package/packages/trajectory/test/store.test.d.ts +2 -0
  194. package/packages/trajectory/test/store.test.ts +250 -0
  195. package/packages/tui/package.json +1 -1
  196. package/packages/types/package.json +1 -1
  197. package/packages/workflow-events/package.json +1 -1
  198. package/packages/workspace-scanner/package.json +1 -1
  199. package/packages/worktree/package.json +1 -1
  200. package/packages/write-review/package.json +1 -1
  201. package/packages/write-review/src/blackboard.ts +38 -5
  202. package/packages/write-review/src/types.ts +13 -0
  203. package/skills/harness-runtime/SKILL.md +67 -4
@@ -0,0 +1,134 @@
1
+ /**
2
+ * ApprovedPatternStore — tracks review patterns that have been approved.
3
+ *
4
+ * Once a reviewer approves code with a given comment, that comment pattern is
5
+ * "learned" and the reviewer should not re-flag it in future sessions.
6
+ *
7
+ * Storage: `~/.pi-harness/approved-patterns.json`
8
+ * Format: keyed by pattern-hash so lookup is O(1)
9
+ *
10
+ * Usage:
11
+ * - Load patterns before each review → inject into reviewer prompt
12
+ * - After "approved" verdict → call .approve() to persist new patterns
13
+ */
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync, } from "node:fs";
15
+ import { join, dirname } from "node:path";
16
+ import { homedir } from "node:os";
17
+ import { createHash } from "node:crypto";
18
+ const APPROVED_PATTERNS_FILE = ".pi-harness/approved-patterns.json";
19
+ function getPatternsPath() {
20
+ return join(homedir(), APPROVED_PATTERNS_FILE);
21
+ }
22
+ function defaultData() {
23
+ return { version: 1, patterns: {} };
24
+ }
25
+ function hashPattern(file, comment, severity) {
26
+ return createHash("sha256")
27
+ .update(`${file ?? ""}|${comment}|${severity}`)
28
+ .digest("hex")
29
+ .slice(0, 16);
30
+ }
31
+ /** Singleton store for approved review patterns. */
32
+ export class ApprovedPatternStore {
33
+ _path;
34
+ _data;
35
+ constructor(path) {
36
+ this._path = path ?? getPatternsPath();
37
+ this._data = this._load();
38
+ }
39
+ _load() {
40
+ if (!existsSync(this._path))
41
+ return defaultData();
42
+ try {
43
+ const raw = readFileSync(this._path, "utf8");
44
+ return JSON.parse(raw);
45
+ }
46
+ catch {
47
+ return defaultData();
48
+ }
49
+ }
50
+ _save() {
51
+ mkdirSync(dirname(this._path), { recursive: true });
52
+ // Atomic write: temp file + rename
53
+ const tmp = `${this._path}.${Date.now()}.tmp`;
54
+ writeFileSync(tmp, JSON.stringify(this._data, null, "\t"), "utf8");
55
+ renameSync(tmp, this._path);
56
+ }
57
+ /** Check if a comment matches an approved pattern. Returns the pattern or null. */
58
+ get(file, comment, severity) {
59
+ const hash = hashPattern(file, comment, severity);
60
+ return this._data.patterns[hash] ?? null;
61
+ }
62
+ /** Record that a pattern was approved. Called after "approved" verdict. */
63
+ approve(comments) {
64
+ const now = new Date().toISOString();
65
+ let changed = false;
66
+ for (const c of comments) {
67
+ const sev = c.severity ?? "minor";
68
+ const hash = hashPattern(c.file, c.comment, sev);
69
+ const existing = this._data.patterns[hash];
70
+ if (existing) {
71
+ existing.approvalCount++;
72
+ existing.approvedAt = now;
73
+ }
74
+ else {
75
+ this._data.patterns[hash] = {
76
+ hash,
77
+ file: c.file,
78
+ comment: c.comment,
79
+ severity: sev,
80
+ approvedAt: now,
81
+ approvalCount: 1,
82
+ };
83
+ }
84
+ changed = true;
85
+ }
86
+ if (changed)
87
+ this._save();
88
+ }
89
+ /**
90
+ * Build a markdown section for injecting into the reviewer prompt.
91
+ * Lists previously-approved patterns so the reviewer can skip them.
92
+ */
93
+ toMarkdown() {
94
+ const patterns = Object.values(this._data.patterns);
95
+ if (patterns.length === 0)
96
+ return "";
97
+ // Show the most recently approved first (top 20)
98
+ const recent = patterns
99
+ .sort((a, b) => b.approvalCount - a.approvalCount)
100
+ .slice(0, 20);
101
+ const lines = ["## Previously Approved Patterns", ""];
102
+ for (const p of recent) {
103
+ const file = p.file ? `\`${p.file}\`: ` : "";
104
+ lines.push(`- ${file}${p.comment} [${p.severity}, approved ${p.approvalCount}x]`);
105
+ }
106
+ lines.push("");
107
+ lines.push("Do NOT flag these patterns again — they were approved in previous reviews.");
108
+ return lines.join("\n");
109
+ }
110
+ /** Get count of known patterns. */
111
+ get size() {
112
+ return Object.keys(this._data.patterns).length;
113
+ }
114
+ /** Export all patterns as an array. */
115
+ toArray() {
116
+ return Object.values(this._data.patterns);
117
+ }
118
+ /** Clear all patterns (for testing). */
119
+ clear() {
120
+ this._data = defaultData();
121
+ this._save();
122
+ }
123
+ }
124
+ /** Singleton. */
125
+ let _store;
126
+ export function getApprovedPatternStore() {
127
+ if (!_store)
128
+ _store = new ApprovedPatternStore();
129
+ return _store;
130
+ }
131
+ export function resetApprovedPatternStore() {
132
+ _store = undefined;
133
+ }
134
+ //# sourceMappingURL=approved-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approved-patterns.js","sourceRoot":"","sources":["../../src/approved-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @pi-harness/trajectory
3
+ *
4
+ * Trajectory capture for the write-review loop.
5
+ * Persists completed cycle records to `~/.pi-harness/trajectories/` for learning.
6
+ *
7
+ * Inspired by Hermes Agent's closed learning loop.
8
+ * See: wiki/ROADMAP.md § M7
9
+ */
10
+ export { TrajectoryStore, getTrajectoryStore, } from "./store.js";
11
+ export { ApprovedPatternStore, getApprovedPatternStore, resetApprovedPatternStore, } from "./approved-patterns.js";
12
+ export type { Trajectory, TrajectorySummary, TrajectoryStats, TrajectoryClassification, TrajectoryLabel, } from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACN,eAAe,EACf,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACX,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,eAAe,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @pi-harness/trajectory
3
+ *
4
+ * Trajectory capture for the write-review loop.
5
+ * Persists completed cycle records to `~/.pi-harness/trajectories/` for learning.
6
+ *
7
+ * Inspired by Hermes Agent's closed learning loop.
8
+ * See: wiki/ROADMAP.md § M7
9
+ */
10
+ export { TrajectoryStore, getTrajectoryStore, } from "./store.js";
11
+ export { ApprovedPatternStore, getApprovedPatternStore, resetApprovedPatternStore, } from "./approved-patterns.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACN,eAAe,EACf,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * TrajectoryStore — persists Trajectory records to `~/.pi-harness/trajectories/`.
3
+ *
4
+ * Format: newline-delimited JSON (NDJSON), one Trajectory per line.
5
+ * - Append-only writes (no locking needed for single-daemon writes)
6
+ * - Grep-friendly for manual inspection
7
+ * - Compact: no document overhead like JSON-array-with-commas
8
+ *
9
+ * File naming: `YYYY-MM/YYYY-MM-DD.ndjson`
10
+ * - Daily rotation keeps files small and manageable
11
+ * - Directory by month for easy archival
12
+ *
13
+ * Directory structure:
14
+ * ~/.pi-harness/trajectories/
15
+ * 2025-07/
16
+ * 2025-07-14.ndjson
17
+ * 2025-07-15.ndjson
18
+ */
19
+ import type { Trajectory, TrajectorySummary, TrajectoryStats, TrajectoryClassification } from "./types.js";
20
+ export type { Trajectory, TrajectorySummary, TrajectoryStats, TrajectoryClassification, TrajectoryLabel, } from "./types.js";
21
+ /**
22
+ * TrajectoryStore — append-only persistence for write-review cycle records.
23
+ *
24
+ * Usage:
25
+ * ```ts
26
+ * const store = new TrajectoryStore();
27
+ *
28
+ * // At cycle start
29
+ * const id = store.start("fix the login bug");
30
+ *
31
+ * // At cycle finish
32
+ * store.append({
33
+ * id,
34
+ * taskRequest: "fix the login bug",
35
+ * createdAt: new Date(startMs).toISOString(),
36
+ * durationMs: Date.now() - startMs,
37
+ * iterations: 2,
38
+ * verdict: "approved",
39
+ * reason: "reviewer approved",
40
+ * plan: "...",
41
+ * code: "...",
42
+ * files: ["auth.ts"],
43
+ * comments: [],
44
+ * summary: "looks good",
45
+ * classified: false,
46
+ * });
47
+ * ```
48
+ */
49
+ export declare class TrajectoryStore {
50
+ private readonly _trajDir;
51
+ constructor(trajDir?: string);
52
+ /** List all trajectories, newest first. */
53
+ list(): Trajectory[];
54
+ /** Summaries only (lightweight list). */
55
+ listSummaries(): TrajectorySummary[];
56
+ /** Append a completed trajectory record. */
57
+ append(trajectory: Trajectory): void;
58
+ /** Start a new trajectory — returns a UUID for the cycle. */
59
+ start(_request: string): string;
60
+ /** Build aggregate statistics. */
61
+ stats(): TrajectoryStats;
62
+ /** Classify a single trajectory. */
63
+ classify(trajectory: Trajectory): TrajectoryClassification;
64
+ /** Get trajectories by verdict (for training set building). */
65
+ byVerdict(verdict: Trajectory["verdict"]): Trajectory[];
66
+ }
67
+ export declare function getTrajectoryStore(): TrajectoryStore;
68
+ export declare function resetTrajectoryStore(): void;
69
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,OAAO,KAAK,EACX,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EAExB,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,eAAe,GACf,MAAM,YAAY,CAAC;AAsDpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,YAAY,OAAO,CAAC,EAAE,MAAM,EAE3B;IAED,2CAA2C;IAC3C,IAAI,IAAI,UAAU,EAAE,CAYnB;IAED,yCAAyC;IACzC,aAAa,IAAI,iBAAiB,EAAE,CAYnC;IAED,4CAA4C;IAC5C,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAInC;IAED,6DAA6D;IAC7D,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9B;IAED,kCAAkC;IAClC,KAAK,IAAI,eAAe,CAmDvB;IAED,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,wBAAwB,CA8BzD;IAED,+DAA+D;IAC/D,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,UAAU,EAAE,CAEtD;CACD;AAcD,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AACD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * TrajectoryStore — persists Trajectory records to `~/.pi-harness/trajectories/`.
3
+ *
4
+ * Format: newline-delimited JSON (NDJSON), one Trajectory per line.
5
+ * - Append-only writes (no locking needed for single-daemon writes)
6
+ * - Grep-friendly for manual inspection
7
+ * - Compact: no document overhead like JSON-array-with-commas
8
+ *
9
+ * File naming: `YYYY-MM/YYYY-MM-DD.ndjson`
10
+ * - Daily rotation keeps files small and manageable
11
+ * - Directory by month for easy archival
12
+ *
13
+ * Directory structure:
14
+ * ~/.pi-harness/trajectories/
15
+ * 2025-07/
16
+ * 2025-07-14.ndjson
17
+ * 2025-07-15.ndjson
18
+ */
19
+ import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, } from "node:fs";
20
+ import { dirname, join } from "node:path";
21
+ import { homedir } from "node:os";
22
+ import { randomUUID } from "node:crypto";
23
+ const DEFAULT_TRAJ_DIR = ".pi-harness/trajectories";
24
+ function getTrajDir(dir) {
25
+ const base = dir ?? DEFAULT_TRAJ_DIR;
26
+ // Absolute paths (starting with / or ~) are used as-is
27
+ if (base.startsWith("/") || base.startsWith("~"))
28
+ return base;
29
+ return join(homedir(), base);
30
+ }
31
+ function getDatePath(dir, timestamp = new Date()) {
32
+ const y = timestamp.getFullYear();
33
+ const m = String(timestamp.getMonth() + 1).padStart(2, "0");
34
+ const d = String(timestamp.getDate()).padStart(2, "0");
35
+ return {
36
+ dir: join(dir, `${y}-${m}`),
37
+ file: join(dir, `${y}-${m}`, `${y}-${m}-${d}.ndjson`),
38
+ };
39
+ }
40
+ /** Ensure the directory and daily file exist. */
41
+ function ensureFile(file) {
42
+ mkdirSync(dirname(file), { recursive: true });
43
+ }
44
+ /** Parse a single NDJSON line, skipping malformed lines. */
45
+ function parseLine(line) {
46
+ try {
47
+ return JSON.parse(line);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ /** Read all trajectory files for a given directory. */
54
+ function readTrajDir(dir) {
55
+ if (!existsSync(dir))
56
+ return [];
57
+ const trajectories = [];
58
+ for (const entry of readdirSync(dir)) {
59
+ if (!entry.endsWith(".ndjson"))
60
+ continue;
61
+ const content = readFileSync(join(dir, entry), "utf8");
62
+ for (const line of content.split("\n")) {
63
+ if (!line.trim())
64
+ continue;
65
+ const t = parseLine(line);
66
+ if (t)
67
+ trajectories.push(t);
68
+ }
69
+ }
70
+ return trajectories;
71
+ }
72
+ /**
73
+ * TrajectoryStore — append-only persistence for write-review cycle records.
74
+ *
75
+ * Usage:
76
+ * ```ts
77
+ * const store = new TrajectoryStore();
78
+ *
79
+ * // At cycle start
80
+ * const id = store.start("fix the login bug");
81
+ *
82
+ * // At cycle finish
83
+ * store.append({
84
+ * id,
85
+ * taskRequest: "fix the login bug",
86
+ * createdAt: new Date(startMs).toISOString(),
87
+ * durationMs: Date.now() - startMs,
88
+ * iterations: 2,
89
+ * verdict: "approved",
90
+ * reason: "reviewer approved",
91
+ * plan: "...",
92
+ * code: "...",
93
+ * files: ["auth.ts"],
94
+ * comments: [],
95
+ * summary: "looks good",
96
+ * classified: false,
97
+ * });
98
+ * ```
99
+ */
100
+ export class TrajectoryStore {
101
+ _trajDir;
102
+ constructor(trajDir) {
103
+ this._trajDir = getTrajDir(trajDir);
104
+ }
105
+ /** List all trajectories, newest first. */
106
+ list() {
107
+ if (!existsSync(this._trajDir))
108
+ return [];
109
+ const all = [];
110
+ for (const monthDir of readdirSync(this._trajDir)) {
111
+ const monthPath = join(this._trajDir, monthDir);
112
+ if (!existsSync(monthPath))
113
+ continue;
114
+ all.push(...readTrajDir(monthPath));
115
+ }
116
+ // Sort newest first
117
+ all.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
118
+ return all;
119
+ }
120
+ /** Summaries only (lightweight list). */
121
+ listSummaries() {
122
+ return this.list().map((t) => ({
123
+ id: t.id,
124
+ taskRequest: t.taskRequest,
125
+ createdAt: t.createdAt,
126
+ durationMs: t.durationMs,
127
+ iterations: t.iterations,
128
+ verdict: t.verdict,
129
+ reason: t.reason,
130
+ files: t.files,
131
+ classified: t.classified,
132
+ }));
133
+ }
134
+ /** Append a completed trajectory record. */
135
+ append(trajectory) {
136
+ const { file } = getDatePath(this._trajDir, new Date(trajectory.createdAt));
137
+ ensureFile(file);
138
+ appendFileSync(file, JSON.stringify(trajectory) + "\n", "utf8");
139
+ }
140
+ /** Start a new trajectory — returns a UUID for the cycle. */
141
+ start(_request) {
142
+ return randomUUID();
143
+ }
144
+ /** Build aggregate statistics. */
145
+ stats() {
146
+ const all = this.list();
147
+ if (all.length === 0) {
148
+ return {
149
+ total: 0,
150
+ byVerdict: { approved: 0, blocked: 0, changes_requested: 0 },
151
+ byLabel: { converged: 0, stuck: 0, blocked: 0, "max-iterations": 0 },
152
+ avgIterations: 0,
153
+ avgDurationMs: 0,
154
+ byFile: {},
155
+ };
156
+ }
157
+ const byVerdict = {
158
+ approved: 0,
159
+ blocked: 0,
160
+ changes_requested: 0,
161
+ };
162
+ const byLabel = {
163
+ converged: 0,
164
+ stuck: 0,
165
+ blocked: 0,
166
+ "max-iterations": 0,
167
+ };
168
+ const byFile = {};
169
+ let totalIterations = 0;
170
+ let totalDuration = 0;
171
+ for (const t of all) {
172
+ byVerdict[t.verdict] = (byVerdict[t.verdict] ?? 0) + 1;
173
+ totalIterations += t.iterations;
174
+ totalDuration += t.durationMs;
175
+ // Derive label from reason string
176
+ const label = classifyLabel(t);
177
+ byLabel[label] = (byLabel[label] ?? 0) + 1;
178
+ // Count files
179
+ for (const file of t.files) {
180
+ byFile[file] = (byFile[file] ?? 0) + 1;
181
+ }
182
+ }
183
+ return {
184
+ total: all.length,
185
+ byVerdict,
186
+ byLabel,
187
+ avgIterations: Math.round(totalIterations / all.length),
188
+ avgDurationMs: Math.round(totalDuration / all.length),
189
+ byFile,
190
+ };
191
+ }
192
+ /** Classify a single trajectory. */
193
+ classify(trajectory) {
194
+ const label = classifyLabel(trajectory);
195
+ let confidence = 0.9;
196
+ let pattern;
197
+ let recommendation;
198
+ if (label === "converged") {
199
+ recommendation =
200
+ trajectory.iterations <= 2
201
+ ? "Fast convergence — good pattern"
202
+ : "Slow but successful — consider review depth";
203
+ }
204
+ else if (label === "stuck") {
205
+ confidence = 0.7;
206
+ pattern = "same-file-repeated";
207
+ recommendation =
208
+ "Loop stuck on same file. Consider pre-flight file analysis or splitting the task.";
209
+ }
210
+ else if (label === "max-iterations") {
211
+ recommendation =
212
+ "Hit iteration cap. Increase maxIterations or simplify the task scope.";
213
+ }
214
+ else {
215
+ recommendation = "Reviewer blocked — escalate to human.";
216
+ }
217
+ return {
218
+ trajectoryId: trajectory.id,
219
+ label,
220
+ confidence,
221
+ pattern,
222
+ recommendation,
223
+ };
224
+ }
225
+ /** Get trajectories by verdict (for training set building). */
226
+ byVerdict(verdict) {
227
+ return this.list().filter((t) => t.verdict === verdict);
228
+ }
229
+ }
230
+ /** Derive a TrajectoryLabel from a Trajectory's reason string. */
231
+ function classifyLabel(t) {
232
+ const r = t.reason.toLowerCase();
233
+ if (r.includes("converged"))
234
+ return "converged";
235
+ if (r.includes("max iterations"))
236
+ return "max-iterations";
237
+ if (r.includes("stuck"))
238
+ return "stuck";
239
+ if (t.verdict === "blocked")
240
+ return "blocked";
241
+ return "converged"; // fallback
242
+ }
243
+ /** Singleton factory — one store per process. */
244
+ let _store;
245
+ export function getTrajectoryStore() {
246
+ if (!_store)
247
+ _store = new TrajectoryStore();
248
+ return _store;
249
+ }
250
+ export function resetTrajectoryStore() {
251
+ _store = undefined;
252
+ }
253
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgBzC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAEpD,SAAS,UAAU,CAAC,GAAY;IAC/B,MAAM,IAAI,GAAG,GAAG,IAAI,gBAAgB,CAAC;IACrC,uDAAuD;IACvD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CACnB,GAAW,EACX,SAAS,GAAS,IAAI,IAAI,EAAE;IAE5B,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO;QACN,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;KACrD,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,SAAS,UAAU,CAAC,IAAY;IAC/B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,4DAA4D;AAC5D,SAAS,SAAS,CAAC,IAAY;IAC9B,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,uDAAuD;AACvD,SAAS,WAAW,CAAC,GAAW;IAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,SAAS;QACzC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC;gBAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,OAAO,eAAe;IACV,QAAQ,CAAS;IAElC,YAAY,OAAgB;QAC3B,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,2CAA2C;IAC3C,IAAI;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,SAAS;YACrC,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,oBAAoB;QACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,yCAAyC;IACzC,aAAa;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,UAAU,EAAE,CAAC,CAAC,UAAU;SACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,UAAsB;QAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5E,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,QAAgB;QACrB,OAAO,UAAU,EAAE,CAAC;IACrB,CAAC;IAED,kCAAkC;IAClC,KAAK;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO;gBACN,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE;gBAC5D,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE;gBACpE,aAAa,EAAE,CAAC;gBAChB,aAAa,EAAE,CAAC;gBAChB,MAAM,EAAE,EAA4B;aACpC,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAiC;YAC/C,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;YACV,iBAAiB,EAAE,CAAC;SACpB,CAAC;QACF,MAAM,OAAO,GAA+B;YAC3C,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC;YACV,gBAAgB,EAAE,CAAC;SACnB,CAAC;QACF,MAAM,MAAM,GAAG,EAA4B,CAAC;QAC5C,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACvD,eAAe,IAAI,CAAC,CAAC,UAAU,CAAC;YAChC,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC;YAE9B,kCAAkC;YAClC,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAE3C,cAAc;YACd,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACF,CAAC;QAED,OAAO;YACN,KAAK,EAAE,GAAG,CAAC,MAAM;YACjB,SAAS;YACT,OAAO;YACP,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC;YACvD,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC;YACrD,MAAM;SACN,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,QAAQ,CAAC,UAAsB;QAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,UAAU,GAAG,GAAG,CAAC;QACrB,IAAI,OAA2B,CAAC;QAChC,IAAI,cAAsB,CAAC;QAE3B,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC3B,cAAc;gBACb,UAAU,CAAC,UAAU,IAAI,CAAC;oBACzB,CAAC,CAAC,iCAAiC;oBACnC,CAAC,CAAC,6CAA6C,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC9B,UAAU,GAAG,GAAG,CAAC;YACjB,OAAO,GAAG,oBAAoB,CAAC;YAC/B,cAAc;gBACb,mFAAmF,CAAC;QACtF,CAAC;aAAM,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;YACvC,cAAc;gBACb,uEAAuE,CAAC;QAC1E,CAAC;aAAM,CAAC;YACP,cAAc,GAAG,uCAAuC,CAAC;QAC1D,CAAC;QAED,OAAO;YACN,YAAY,EAAE,UAAU,CAAC,EAAE;YAC3B,KAAK;YACL,UAAU;YACV,OAAO;YACP,cAAc;SACd,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,SAAS,CAAC,OAA8B;QACvC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACzD,CAAC;CACD;AAED,kEAAkE;AAClE,SAAS,aAAa,CAAC,CAAa;IACnC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IAChD,IAAI,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,WAAW,CAAC,CAAC,WAAW;AAChC,CAAC;AAED,iDAAiD;AACjD,IAAI,MAAmC,CAAC;AACxC,MAAM,UAAU,kBAAkB;IACjC,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IAC5C,OAAO,MAAM,CAAC;AACf,CAAC;AACD,MAAM,UAAU,oBAAoB;IACnC,MAAM,GAAG,SAAS,CAAC;AACpB,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Trajectory types — structured write-review cycle records for learning.
3
+ *
4
+ * Each completed loop cycle produces one Trajectory entry. These are persisted
5
+ * to `~/.pi-harness/trajectories/` as newline-delimited JSON (NDJSON), one
6
+ * record per line. Simple, append-only, and grep-friendly.
7
+ */
8
+ export interface Comment {
9
+ file?: string;
10
+ comment: string;
11
+ severity: "minor" | "major" | "critical";
12
+ }
13
+ /** A completed write-review loop cycle. */
14
+ export interface Trajectory {
15
+ /** Stable UUID — generated at cycle start, persisted in state. */
16
+ id: string;
17
+ /** Original user request that triggered the loop. */
18
+ taskRequest: string;
19
+ /** ISO-8601 timestamp when the cycle started. */
20
+ createdAt: string;
21
+ /** Wall-clock duration in milliseconds. */
22
+ durationMs: number;
23
+ /** Number of write-review rounds completed. */
24
+ iterations: number;
25
+ /** Final verdict from the GPT reviewer. */
26
+ verdict: "approved" | "blocked" | "changes_requested";
27
+ /** Human-readable termination reason (from finishNode). */
28
+ reason: string;
29
+ /** Plan produced by the GPT planner. */
30
+ plan: string;
31
+ /** Final code output from the MiniMax coder. */
32
+ code: string;
33
+ /** Files mentioned in comments across all review iterations. */
34
+ files: string[];
35
+ /** All comments from the final review iteration. */
36
+ comments: Comment[];
37
+ /** Final review summary. */
38
+ summary: string;
39
+ /** Whether this trajectory was used for training/classification. */
40
+ classified: boolean;
41
+ }
42
+ /** Lightweight summary for list/aggregate queries. */
43
+ export interface TrajectorySummary {
44
+ id: string;
45
+ taskRequest: string;
46
+ createdAt: string;
47
+ durationMs: number;
48
+ iterations: number;
49
+ verdict: Trajectory["verdict"];
50
+ reason: string;
51
+ files: string[];
52
+ classified: boolean;
53
+ }
54
+ /** Classification label applied by the trajectory classifier. */
55
+ export type TrajectoryLabel = "converged" | "stuck" | "blocked" | "max-iterations";
56
+ /** Classification result for a trajectory. */
57
+ export interface TrajectoryClassification {
58
+ trajectoryId: string;
59
+ label: TrajectoryLabel;
60
+ confidence: number;
61
+ pattern?: string;
62
+ recommendation: string;
63
+ }
64
+ /** Aggregated statistics across a set of trajectories. */
65
+ export interface TrajectoryStats {
66
+ total: number;
67
+ byVerdict: Record<Trajectory["verdict"], number>;
68
+ byLabel: Record<TrajectoryLabel, number>;
69
+ avgIterations: number;
70
+ avgDurationMs: number;
71
+ byFile: Record<string, number>;
72
+ }
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,OAAO;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;CACzC;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IAC1B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,mBAAmB,CAAC;IACtD,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,iEAAiE;AACjE,MAAM,MAAM,eAAe,GACxB,WAAW,GACX,OAAO,GACP,SAAS,GACT,gBAAgB,CAAC;AAEpB,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Trajectory types — structured write-review cycle records for learning.
3
+ *
4
+ * Each completed loop cycle produces one Trajectory entry. These are persisted
5
+ * to `~/.pi-harness/trajectories/` as newline-delimited JSON (NDJSON), one
6
+ * record per line. Simple, append-only, and grep-friendly.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../test/store.test.ts"],"names":[],"mappings":""}