pi-harness-runtime 1.1.47 → 1.1.49

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 (93) hide show
  1. package/harness/langchain/daemon.ts +108 -90
  2. package/harness/langchain/status-line.test.ts +20 -6
  3. package/harness/langchain/status-line.ts +7 -7
  4. package/package.json +1 -1
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/knowledge-graph/package.json +1 -1
  42. package/packages/knowledge-retrieval/package.json +1 -1
  43. package/packages/laravel-plugin/package.json +1 -1
  44. package/packages/learning-engine/package.json +1 -1
  45. package/packages/mcp-adapter/package.json +1 -1
  46. package/packages/memory-engine/package.json +1 -1
  47. package/packages/milestone-manager/package.json +1 -1
  48. package/packages/model-registry/package.json +1 -1
  49. package/packages/nextjs-plugin/package.json +1 -1
  50. package/packages/notification/package.json +1 -1
  51. package/packages/observability/package.json +1 -1
  52. package/packages/okf-indexer/package.json +1 -1
  53. package/packages/performance-optimizer/package.json +1 -1
  54. package/packages/privilege-broker/package.json +1 -1
  55. package/packages/project-analyzer/package.json +1 -1
  56. package/packages/project-bootstrap/package.json +1 -1
  57. package/packages/projection-engine/package.json +1 -1
  58. package/packages/prompt-compiler/package.json +1 -1
  59. package/packages/prompt-versioning/package.json +1 -1
  60. package/packages/provider-adapter-sdk/package.json +1 -1
  61. package/packages/provider-router/package.json +1 -1
  62. package/packages/provider-selector/package.json +1 -1
  63. package/packages/providers/package.json +1 -1
  64. package/packages/quota-manager/package.json +1 -1
  65. package/packages/rate-limiter/package.json +1 -1
  66. package/packages/react-vite-plugin/package.json +1 -1
  67. package/packages/release-manager/package.json +1 -1
  68. package/packages/requirement-compiler/package.json +1 -1
  69. package/packages/runtime/package.json +1 -1
  70. package/packages/scheduler/package.json +1 -1
  71. package/packages/scheduler-adapter/package.json +1 -1
  72. package/packages/session/package.json +1 -1
  73. package/packages/session-api/package.json +1 -1
  74. package/packages/session-export/package.json +1 -1
  75. package/packages/shared-context/package.json +1 -1
  76. package/packages/skill-mcp-client/package.json +1 -1
  77. package/packages/skill-registry/package.json +1 -1
  78. package/packages/sprint-planner/package.json +1 -1
  79. package/packages/subscription-engine/package.json +1 -1
  80. package/packages/task-compiler/package.json +1 -1
  81. package/packages/tencentdb-memory/package.json +1 -1
  82. package/packages/tencentdb-sync/package.json +1 -1
  83. package/packages/test-data-generator/package.json +1 -1
  84. package/packages/test-generator/package.json +1 -1
  85. package/packages/todo-bd-sync/package.json +1 -1
  86. package/packages/token-estimation/package.json +1 -1
  87. package/packages/token-optimizer/package.json +1 -1
  88. package/packages/tui/package.json +1 -1
  89. package/packages/types/package.json +1 -1
  90. package/packages/workflow-events/package.json +1 -1
  91. package/packages/workspace-scanner/package.json +1 -1
  92. package/packages/worktree/package.json +1 -1
  93. package/packages/write-review/package.json +1 -1
@@ -539,95 +539,105 @@ class BdTasksWatcher {
539
539
  * Set "enabled": false to pause without deleting.
540
540
  */
541
541
  class CronWatcher {
542
- private readonly workspace: string;
543
- private readonly scheduleMs: Record<string, number>;
544
- private readonly seen: Map<string, Set<string>> = new Map();
545
- private readonly timers: Map<string, ReturnType<typeof setTimeout>> = new Map();
546
- private running = false;
547
-
548
- constructor(workspace: string) {
549
- this.workspace = workspace;
550
- this.scheduleMs = {
551
- "every-5m": 5 * 60_000,
552
- "every-10m": 10 * 60_000,
553
- "every-30m": 30 * 60_000,
554
- hourly: 3_600_000,
555
- daily: 86_400_000,
556
- weekly: 7 * 86_400_000,
557
- };
558
- }
559
-
560
- start(onTask: (task: TriggeredTask) => void): void {
561
- this.running = true;
562
- const cronDir = `${this.workspace}/.cron-tasks`;
563
- import("node:fs").then(({ mkdirSync, existsSync }) => {
564
- if (!existsSync(cronDir)) mkdirSync(cronDir, { recursive: true });
565
- });
566
- // Fire once at start
567
- this._tickAll(onTask);
568
- // Schedule each bucket
569
- for (const [schedule, ms] of Object.entries(this.scheduleMs)) {
570
- this._scheduleNext(schedule, ms, onTask);
571
- }
572
- }
573
-
574
- stop(): void {
575
- this.running = false;
576
- for (const t of this.timers.values()) clearTimeout(t);
577
- this.timers.clear();
578
- }
579
-
580
- private _scheduleNext(
581
- schedule: string,
582
- ms: number,
583
- onTask: (task: TriggeredTask) => void,
584
- ): void {
585
- const timer = setTimeout(async () => {
586
- if (!this.running) return;
587
- await this._tickSchedule(schedule, onTask);
588
- this._scheduleNext(schedule, ms, onTask);
589
- }, ms);
590
- this.timers.set(schedule, timer);
591
- }
592
-
593
- private async _tickAll(onTask: (task: TriggeredTask) => void): Promise<void> {
594
- for (const schedule of Object.keys(this.scheduleMs)) {
595
- await this._tickSchedule(schedule, onTask);
596
- }
597
- }
598
-
599
- private async _tickSchedule(
600
- schedule: string,
601
- onTask: (task: TriggeredTask) => void,
602
- ): Promise<void> {
603
- if (!this.running) return;
604
- const { readdirSync, readFileSync, existsSync } = await import("node:fs");
605
- const cronDir = `${this.workspace}/.cron-tasks/${schedule}`;
606
- if (!existsSync(cronDir)) return;
607
-
608
- let seen = this.seen.get(schedule);
609
- if (!seen) { seen = new Set(); this.seen.set(schedule, seen); }
610
-
611
- let files: string[];
612
- try { files = readdirSync(cronDir).filter((f) => f.endsWith(".json")); }
613
- catch { return; }
614
-
615
- for (const file of files) {
616
- if (seen.has(file)) continue;
617
- seen.add(file);
618
- let taskData: { request?: string; enabled?: boolean };
619
- try { taskData = JSON.parse(readFileSync(`${cronDir}/${file}`, "utf8")); }
620
- catch { continue; }
621
- if (taskData.enabled === false) continue;
622
- if (!taskData.request) continue;
623
- onTask({
624
- taskId: `cron:${schedule}:${file.replace(".json", "")}`,
625
- request: taskData.request,
626
- source: "cron",
627
- triggeredAt: new Date().toISOString(),
628
- });
629
- }
630
- }
542
+ private readonly workspace: string;
543
+ private readonly scheduleMs: Record<string, number>;
544
+ private readonly seen: Map<string, Set<string>> = new Map();
545
+ private readonly timers: Map<string, ReturnType<typeof setTimeout>> =
546
+ new Map();
547
+ private running = false;
548
+
549
+ constructor(workspace: string) {
550
+ this.workspace = workspace;
551
+ this.scheduleMs = {
552
+ "every-5m": 5 * 60_000,
553
+ "every-10m": 10 * 60_000,
554
+ "every-30m": 30 * 60_000,
555
+ hourly: 3_600_000,
556
+ daily: 86_400_000,
557
+ weekly: 7 * 86_400_000,
558
+ };
559
+ }
560
+
561
+ start(onTask: (task: TriggeredTask) => void): void {
562
+ this.running = true;
563
+ const cronDir = `${this.workspace}/.cron-tasks`;
564
+ import("node:fs").then(({ mkdirSync, existsSync }) => {
565
+ if (!existsSync(cronDir)) mkdirSync(cronDir, { recursive: true });
566
+ });
567
+ // Fire once at start
568
+ this._tickAll(onTask);
569
+ // Schedule each bucket
570
+ for (const [schedule, ms] of Object.entries(this.scheduleMs)) {
571
+ this._scheduleNext(schedule, ms, onTask);
572
+ }
573
+ }
574
+
575
+ stop(): void {
576
+ this.running = false;
577
+ for (const t of this.timers.values()) clearTimeout(t);
578
+ this.timers.clear();
579
+ }
580
+
581
+ private _scheduleNext(
582
+ schedule: string,
583
+ ms: number,
584
+ onTask: (task: TriggeredTask) => void,
585
+ ): void {
586
+ const timer = setTimeout(async () => {
587
+ if (!this.running) return;
588
+ await this._tickSchedule(schedule, onTask);
589
+ this._scheduleNext(schedule, ms, onTask);
590
+ }, ms);
591
+ this.timers.set(schedule, timer);
592
+ }
593
+
594
+ private async _tickAll(onTask: (task: TriggeredTask) => void): Promise<void> {
595
+ for (const schedule of Object.keys(this.scheduleMs)) {
596
+ await this._tickSchedule(schedule, onTask);
597
+ }
598
+ }
599
+
600
+ private async _tickSchedule(
601
+ schedule: string,
602
+ onTask: (task: TriggeredTask) => void,
603
+ ): Promise<void> {
604
+ if (!this.running) return;
605
+ const { readdirSync, readFileSync, existsSync } = await import("node:fs");
606
+ const cronDir = `${this.workspace}/.cron-tasks/${schedule}`;
607
+ if (!existsSync(cronDir)) return;
608
+
609
+ let seen = this.seen.get(schedule);
610
+ if (!seen) {
611
+ seen = new Set();
612
+ this.seen.set(schedule, seen);
613
+ }
614
+
615
+ let files: string[];
616
+ try {
617
+ files = readdirSync(cronDir).filter((f) => f.endsWith(".json"));
618
+ } catch {
619
+ return;
620
+ }
621
+
622
+ for (const file of files) {
623
+ if (seen.has(file)) continue;
624
+ seen.add(file);
625
+ let taskData: { request?: string; enabled?: boolean };
626
+ try {
627
+ taskData = JSON.parse(readFileSync(`${cronDir}/${file}`, "utf8"));
628
+ } catch {
629
+ continue;
630
+ }
631
+ if (taskData.enabled === false) continue;
632
+ if (!taskData.request) continue;
633
+ onTask({
634
+ taskId: `cron:${schedule}:${file.replace(".json", "")}`,
635
+ request: taskData.request,
636
+ source: "cron",
637
+ triggeredAt: new Date().toISOString(),
638
+ });
639
+ }
640
+ }
631
641
  }
632
642
 
633
643
  // ─── Tunnel Health Monitor ───────────────────────────────────────────────────
@@ -1100,7 +1110,12 @@ export class LoopDaemon {
1100
1110
  : "max_iterations",
1101
1111
  );
1102
1112
  }
1103
- const loopDone = verdict === "approved" ? "✅ finished" : verdict === "blocked" ? "⛔ blocked" : "🔄 max_iter";
1113
+ const loopDone =
1114
+ verdict === "approved"
1115
+ ? "[F] finished"
1116
+ : verdict === "blocked"
1117
+ ? "[!] blocked"
1118
+ : "[~] max_iter";
1104
1119
  this.statusLine?.updateLoopStatus(loopDone);
1105
1120
 
1106
1121
  // ── Gate check after blocked verdict ────────────────────────────────
@@ -1196,16 +1211,19 @@ export class LoopDaemon {
1196
1211
  switch (step) {
1197
1212
  case "plan": {
1198
1213
  w.setPhase("planning", "GPT planning");
1214
+ this.statusLine?.updateLoopStatus("[P] planning");
1199
1215
  break;
1200
1216
  }
1201
1217
  case "write": {
1202
1218
  w.setPhase("writing", "MiniMax coding");
1219
+ this.statusLine?.updateLoopStatus("[W] coding");
1203
1220
  // After a write step, bump the iteration counter
1204
1221
  w.startIteration(state.iteration, this.config.maxIterations);
1205
1222
  break;
1206
1223
  }
1207
1224
  case "review": {
1208
1225
  w.setPhase("reviewing", "GPT reviewing");
1226
+ this.statusLine?.updateLoopStatus("[R] reviewing");
1209
1227
  // Process review comments — one record per file
1210
1228
  const comments = state.review?.comments ?? [];
1211
1229
  if (comments.length === 0) break;
@@ -9,7 +9,11 @@ import { describe, it, beforeEach, afterEach } from "node:test";
9
9
  import assert from "node:assert";
10
10
  import { existsSync, readFileSync, rmSync, writeFileSync, mkdirSync } from "fs";
11
11
  import { join } from "path";
12
- import { StatusLineManager, isPiLensAvailable, formatQuotaLine } from "./status-line.js";
12
+ import {
13
+ StatusLineManager,
14
+ isPiLensAvailable,
15
+ formatQuotaLine,
16
+ } from "./status-line.js";
13
17
 
14
18
  describe("isPiLensAvailable", () => {
15
19
  it("returns false when no PI_LENS env vars are set", () => {
@@ -47,13 +51,19 @@ describe("formatQuotaLine", () => {
47
51
 
48
52
  it("shows reset countdown when resetAt is provided", () => {
49
53
  const future = new Date(Date.now() + 2 * 60 * 60 * 1000).toISOString(); // 2h from now
50
- const line = formatQuotaLine({ fiveHourPercent: 89, fiveHourResetAt: future });
54
+ const line = formatQuotaLine({
55
+ fiveHourPercent: 89,
56
+ fiveHourResetAt: future,
57
+ });
51
58
  assert.ok(line.includes("resets in"), line);
52
59
  });
53
60
  });
54
61
 
55
62
  describe("StatusLineManager", () => {
56
- const tmpDir = join(process.env.TMPDIR ?? "/tmp", `harness-status-test-${Date.now()}`);
63
+ const tmpDir = join(
64
+ process.env.TMPDIR ?? "/tmp",
65
+ `harness-status-test-${Date.now()}`,
66
+ );
57
67
  let manager: StatusLineManager;
58
68
 
59
69
  beforeEach(() => {
@@ -63,11 +73,15 @@ describe("StatusLineManager", () => {
63
73
 
64
74
  afterEach(() => {
65
75
  manager.stop();
66
- try { rmSync(tmpDir, { recursive: true, force: true }); } catch { /* ignore */ }
76
+ try {
77
+ rmSync(tmpDir, { recursive: true, force: true });
78
+ } catch {
79
+ /* ignore */
80
+ }
67
81
  });
68
82
 
69
83
  it("getLine returns combined loop + quota status", () => {
70
- manager.updateLoopStatus("🧭 planning");
84
+ manager.updateLoopStatus("[P] planning");
71
85
  const line = manager.getLine();
72
86
  assert.ok(line.includes("planning"), line);
73
87
  });
@@ -78,7 +92,7 @@ describe("StatusLineManager", () => {
78
92
  });
79
93
 
80
94
  it("writes .harness-status file when pi-lens is not available", () => {
81
- manager.updateLoopStatus("✍️ coding");
95
+ manager.updateLoopStatus("[W] coding");
82
96
  const statusFile = join(tmpDir, ".harness-status");
83
97
  assert.ok(existsSync(statusFile), ".harness-status should exist");
84
98
  const content = readFileSync(statusFile, "utf8");
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * The status line shows two tiers of information:
11
11
  * [loop status] [API quota]
12
- * 🧭 planning MiniMax: 5h: 89% left · week: 90% left
12
+ * [P] planning | MiniMax: 5h: 89% left · week: 90% left
13
13
  *
14
14
  * API quota is read from ~/.pi-harness/quota.json (written by the pi host
15
15
  * process that has access to the TUI quota signals). The daemon polls this
@@ -95,12 +95,12 @@ function fmtResetAt(iso?: string): string {
95
95
  * Format: "MiniMax: 5h: 89% left (resets in 2h) · week: 90% left"
96
96
  */
97
97
  export function formatQuotaLine(q: QuotaData): string {
98
- const fiveHour = q.fiveHourPercent === undefined
99
- ? null
100
- : `5h: ${fmtPercent(q.fiveHourPercent)}${fmtResetAt(q.fiveHourResetAt)}`;
101
- const weekly = q.weeklyPercent === undefined
102
- ? null
103
- : `week: ${fmtPercent(q.weeklyPercent)}`;
98
+ const fiveHour =
99
+ q.fiveHourPercent === undefined
100
+ ? null
101
+ : `5h: ${fmtPercent(q.fiveHourPercent)}${fmtResetAt(q.fiveHourResetAt)}`;
102
+ const weekly =
103
+ q.weeklyPercent === undefined ? null : `week: ${fmtPercent(q.weeklyPercent)}`;
104
104
 
105
105
  const parts = [fiveHour, weekly].filter(Boolean);
106
106
  if (parts.length === 0) return "MiniMax: quota unknown";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-harness-runtime",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "[BETA] Codex-style /usage status + autonomous coding harness for pi. Not production ready — expect breaking changes.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/a2a-adapter",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Google Agent-to-Agent (A2A) protocol adapter for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/architecture-generator",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Generate ADR and Mermaid diagrams from project analysis",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/auth",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "pi-harness-runtime — auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/autonomous-refactor",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Autonomous refactoring engine",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/autonomous-runtime",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Autonomous Operations Runtime — task inbox, lease management, and worker lifecycle (RFC-0101)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/cache-strategy",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Smart caching with TTL and invalidation strategies (RFC-0022)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/capability-registry",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Capability Registry for pi-harness-runtime — tracks model capabilities and enables capability-based routing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/checkpoint",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Enhanced checkpoint system with incremental snapshots, diff-based storage, and recovery strategies",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/cli-plugin-sdk",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "CLI Plugin SDK for pi-harness — install, list, remove, update, invoke plugins",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/clipboard",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/clipboard-plugin",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/code-generation",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Code generation pipeline for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/code-review",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Automated code review engine for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/codex-adapter",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "OpenAI Codex provider adapter for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/config-capture",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Auto-capture API-fetched configuration values to AGENTS.md",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-compiler",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Bounded context selection engine for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-discovery",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/context-manager",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Context Window Manager — prevents model context overflow via compaction and resume prompts (RFC-0010)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cookie-sanitizer",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "pi-harness-runtime — cookie sanitizer (provider-quota cookie file normaliser)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cost-optimizer",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Cost Optimizer for pi-harness-runtime — budget tracking, forecasting, and model selection optimization",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/dependency-analyzer",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/django-plugin",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Django framework analysis — models, management commands, settings",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/doc-generator",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Auto-Doc Generator — generate documentation from source code (RFC-0014)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/evaluation-engine",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Evaluation engine for pi-harness runtime (RFC-0057)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/evaluation-runner",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic evaluation framework for AI outputs (RFC-0020)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-bus",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/experience-replay",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Experience replay for debugging and reproducibility (RFC-0059)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/feedback-collector",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "type": "module",
5
5
  "description": "Collect and aggregate human/automated feedback (RFC-0021)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/file-copy-helper",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Injects cp/sudo cp rule when user asks to mimic/copy files",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-detector",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Framework detection system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-plugin-sdk",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Framework plugin SDK for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/frappe-plugin",
3
- "version": "1.1.47",
3
+ "version": "1.1.49",
4
4
  "description": "Frappe/ERPNext framework analysis — DocTypes, hooks, bench sites, site config",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",