pi-harness-runtime 1.1.320 → 1.1.321

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 (111) hide show
  1. package/package.json +1 -1
  2. package/packages/a2a-adapter/package.json +1 -1
  3. package/packages/agent-policy/dist/extension.d.ts.map +1 -1
  4. package/packages/agent-policy/dist/extension.js +16 -0
  5. package/packages/agent-policy/dist/extension.js.map +1 -1
  6. package/packages/agent-policy/dist/policy-loader.d.ts +11 -0
  7. package/packages/agent-policy/dist/policy-loader.d.ts.map +1 -1
  8. package/packages/agent-policy/dist/policy-loader.js +44 -19
  9. package/packages/agent-policy/dist/policy-loader.js.map +1 -1
  10. package/packages/agent-policy/package.json +1 -1
  11. package/packages/agent-policy/src/extension.ts +23 -0
  12. package/packages/agent-policy/src/policy-loader.ts +49 -20
  13. package/packages/agent-policy/test/policy-retention.test.ts +299 -0
  14. package/packages/architecture-generator/package.json +1 -1
  15. package/packages/auth/package.json +1 -1
  16. package/packages/autonomous-refactor/package.json +1 -1
  17. package/packages/autonomous-runtime/package.json +1 -1
  18. package/packages/cache-strategy/package.json +1 -1
  19. package/packages/capability-registry/package.json +1 -1
  20. package/packages/checkpoint/package.json +1 -1
  21. package/packages/cli-plugin-sdk/package.json +1 -1
  22. package/packages/clipboard/package.json +1 -1
  23. package/packages/clipboard-plugin/package.json +1 -1
  24. package/packages/code-generation/package.json +1 -1
  25. package/packages/code-review/package.json +1 -1
  26. package/packages/codex-adapter/package.json +1 -1
  27. package/packages/codex-watcher/package.json +1 -1
  28. package/packages/config-capture/package.json +1 -1
  29. package/packages/context-compiler/package.json +1 -1
  30. package/packages/context-discovery/package.json +1 -1
  31. package/packages/context-manager/package.json +1 -1
  32. package/packages/cookie-sanitizer/package.json +1 -1
  33. package/packages/cost-optimizer/package.json +1 -1
  34. package/packages/dependency-analyzer/package.json +1 -1
  35. package/packages/django-plugin/package.json +1 -1
  36. package/packages/doc-generator/package.json +1 -1
  37. package/packages/durable-review/package.json +1 -1
  38. package/packages/e2e-tester/package.json +1 -1
  39. package/packages/evaluation-engine/package.json +1 -1
  40. package/packages/evaluation-runner/package.json +1 -1
  41. package/packages/event-bus/package.json +1 -1
  42. package/packages/event-store/package.json +1 -1
  43. package/packages/experience-replay/package.json +1 -1
  44. package/packages/feedback-collector/package.json +1 -1
  45. package/packages/file-copy-helper/package.json +1 -1
  46. package/packages/framework-detector/package.json +1 -1
  47. package/packages/framework-plugin-sdk/package.json +1 -1
  48. package/packages/frappe-plugin/package.json +1 -1
  49. package/packages/generic-web-plugin/package.json +1 -1
  50. package/packages/health-monitor/package.json +1 -1
  51. package/packages/intent-analyzer/package.json +1 -1
  52. package/packages/jev-judge/package.json +1 -1
  53. package/packages/knowledge-graph/package.json +1 -1
  54. package/packages/knowledge-retrieval/package.json +1 -1
  55. package/packages/laravel-plugin/package.json +1 -1
  56. package/packages/learning-engine/package.json +1 -1
  57. package/packages/mcp-adapter/package.json +1 -1
  58. package/packages/memory-engine/package.json +1 -1
  59. package/packages/milestone-manager/package.json +1 -1
  60. package/packages/model-registry/package.json +1 -1
  61. package/packages/nextjs-plugin/package.json +1 -1
  62. package/packages/notification/package.json +1 -1
  63. package/packages/observability/package.json +1 -1
  64. package/packages/okf-indexer/package.json +1 -1
  65. package/packages/paperclip-integration/package.json +1 -1
  66. package/packages/performance-optimizer/package.json +1 -1
  67. package/packages/privilege-broker/package.json +1 -1
  68. package/packages/project-analyzer/package.json +1 -1
  69. package/packages/project-bootstrap/package.json +1 -1
  70. package/packages/projection-engine/package.json +1 -1
  71. package/packages/prompt-compiler/package.json +1 -1
  72. package/packages/prompt-versioning/package.json +1 -1
  73. package/packages/provider-adapter-sdk/package.json +1 -1
  74. package/packages/provider-router/package.json +1 -1
  75. package/packages/provider-selector/package.json +1 -1
  76. package/packages/providers/package.json +1 -1
  77. package/packages/qdrant-skills/package.json +1 -1
  78. package/packages/quota-manager/package.json +1 -1
  79. package/packages/rate-limiter/package.json +1 -1
  80. package/packages/react-vite-plugin/package.json +1 -1
  81. package/packages/release-manager/package.json +1 -1
  82. package/packages/requirement-compiler/package.json +1 -1
  83. package/packages/runtime/package.json +1 -1
  84. package/packages/scheduler/package.json +1 -1
  85. package/packages/scheduler-adapter/package.json +1 -1
  86. package/packages/session/package.json +1 -1
  87. package/packages/session-api/package.json +1 -1
  88. package/packages/session-export/package.json +1 -1
  89. package/packages/shared-context/package.json +1 -1
  90. package/packages/skill-mcp-client/package.json +1 -1
  91. package/packages/skill-registry/package.json +1 -1
  92. package/packages/skills/package.json +1 -1
  93. package/packages/sprint-planner/package.json +1 -1
  94. package/packages/subscription-engine/package.json +1 -1
  95. package/packages/task-compiler/package.json +1 -1
  96. package/packages/telegram/package.json +1 -1
  97. package/packages/tencentdb-memory/package.json +1 -1
  98. package/packages/tencentdb-sync/package.json +1 -1
  99. package/packages/test-data-generator/package.json +1 -1
  100. package/packages/test-generator/package.json +1 -1
  101. package/packages/todo-bd-sync/package.json +1 -1
  102. package/packages/token-estimation/package.json +1 -1
  103. package/packages/token-optimizer/package.json +1 -1
  104. package/packages/trajectory/package.json +1 -1
  105. package/packages/tui/package.json +1 -1
  106. package/packages/types/package.json +1 -1
  107. package/packages/webmcp-tester/package.json +1 -1
  108. package/packages/workflow-events/package.json +1 -1
  109. package/packages/workspace-scanner/package.json +1 -1
  110. package/packages/worktree/package.json +1 -1
  111. package/packages/write-review/package.json +1 -1
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Policy Retention Tests
3
+ *
4
+ * Tests for lifecycle retention after compaction, reset, resume.
5
+ */
6
+
7
+ import { describe, it, before, after } from "node:test";
8
+ import assert from "node:assert";
9
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, rmSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ import { randomUUID } from "node:crypto";
12
+ import type { PolicyManifest } from "../dist/types.js";
13
+ import { PolicyLoader } from "../dist/policy-loader.js";
14
+ import { getPolicyStore, resetPolicyStore } from "../dist/policy-store.js";
15
+
16
+ // Test workspace
17
+ const TEST_DIR = "/tmp/policy-retention-test-" + Date.now();
18
+ const AGENTS_MD = join(TEST_DIR, "AGENTS.md");
19
+ const RULES_MD = join(TEST_DIR, "RULES.md");
20
+
21
+ describe("Policy Retention Tests", () => {
22
+ before(() => {
23
+ mkdirSync(TEST_DIR, { recursive: true });
24
+ resetPolicyStore();
25
+ });
26
+
27
+ after(() => {
28
+ try {
29
+ rmSync(TEST_DIR, { recursive: true, force: true });
30
+ } catch {
31
+ // ignore cleanup errors
32
+ }
33
+ resetPolicyStore();
34
+ });
35
+
36
+ // --- Session Epoch Tests ---
37
+ describe("Session epochs", () => {
38
+ it("should track session epochs separately", async () => {
39
+ const store = getPolicyStore();
40
+ const session1 = "session-1-" + randomUUID().slice(0, 8);
41
+ const session2 = "session-2-" + randomUUID().slice(0, 8);
42
+
43
+ // Create a manifest
44
+ const manifest: PolicyManifest = {
45
+ revision: "abc123",
46
+ projectRoot: TEST_DIR,
47
+ trust: "unknown",
48
+ coverage: "complete",
49
+ sources: [],
50
+ loadedAt: Date.now(),
51
+ };
52
+
53
+ // Note delivery for session 1
54
+ const receipt1 = store.noteDelivered(session1, manifest, "system_prompt");
55
+ assert.strictEqual(receipt1.sessionId, session1);
56
+
57
+ // Session 2 should NOT have a receipt
58
+ const receipt2 = store.getReceipt(session2, TEST_DIR);
59
+ assert.strictEqual(receipt2, null);
60
+ });
61
+
62
+ it("should not leak receipts between sessions after reset", async () => {
63
+ const store = getPolicyStore();
64
+ const sessionId = "session-reset-" + randomUUID().slice(0, 8);
65
+
66
+ const manifest: PolicyManifest = {
67
+ revision: "abc123",
68
+ projectRoot: TEST_DIR,
69
+ trust: "unknown",
70
+ coverage: "complete",
71
+ sources: [],
72
+ loadedAt: Date.now(),
73
+ };
74
+
75
+ // Deliver to session
76
+ store.noteDelivered(sessionId, manifest, "system_prompt");
77
+
78
+ // Clear session
79
+ store.clearSession(sessionId);
80
+
81
+ // Receipt should be gone
82
+ const receipt = store.getReceipt(sessionId, TEST_DIR);
83
+ assert.strictEqual(receipt, null);
84
+ });
85
+ });
86
+
87
+ // --- Source Change Tests ---
88
+ describe("Source changes", () => {
89
+ it("should invalidate receipts when AGENTS.md changes", async () => {
90
+ const store = getPolicyStore();
91
+ const sessionId = "session-change-" + randomUUID().slice(0, 8);
92
+
93
+ // Write initial content
94
+ writeFileSync(AGENTS_MD, "# Original Agents\n\nFollow the rules.", "utf8");
95
+
96
+ const loader = new PolicyLoader({
97
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
98
+ });
99
+
100
+ // Load and deliver
101
+ const manifest1 = await loader.load(TEST_DIR);
102
+ store.noteDelivered(sessionId, manifest1, "system_prompt");
103
+
104
+ // Modify file
105
+ writeFileSync(AGENTS_MD, "# Updated Agents\n\nDifferent rules.", "utf8");
106
+
107
+ // Invalidate cache
108
+ loader.invalidateCache(TEST_DIR);
109
+
110
+ // Load new manifest
111
+ const manifest2 = await loader.load(TEST_DIR);
112
+
113
+ // Revision should be different
114
+ assert.notStrictEqual(manifest1.revision, manifest2.revision);
115
+
116
+ // Old receipt should NOT cover new manifest
117
+ const hasCoverage = store.hasValidReceipt(sessionId, manifest2);
118
+ assert.strictEqual(hasCoverage, false);
119
+ });
120
+
121
+ it("should include RULES.md in sources", async () => {
122
+ // Write RULES.md
123
+ writeFileSync(RULES_MD, "# Rules\n\nThese are rules.", "utf8");
124
+
125
+ const loader = new PolicyLoader({
126
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
127
+ });
128
+
129
+ const manifest = await loader.load(TEST_DIR);
130
+
131
+ // RULES.md should be included as advisory at minimum
132
+ const rulesSource = manifest.sources.find(s => s.path.includes("RULES.md"));
133
+ assert.ok(rulesSource, "RULES.md should be included in sources");
134
+
135
+ // Clean up
136
+ unlinkSync(RULES_MD);
137
+ });
138
+ });
139
+
140
+ // --- Bounded Delivery Tests ---
141
+ describe("Bounded delivery", () => {
142
+ it("should track exact revision and source coverage", async () => {
143
+ const store = getPolicyStore();
144
+ const sessionId = "session-exact-" + randomUUID().slice(0, 8);
145
+
146
+ writeFileSync(AGENTS_MD, "# Agents\n\nContent.", "utf8");
147
+
148
+ const loader = new PolicyLoader({
149
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
150
+ });
151
+
152
+ const manifest = await loader.load(TEST_DIR);
153
+
154
+ // Note delivery with specific sections
155
+ const receipt = store.noteDelivered(sessionId, manifest, "tool", ["section-1"]);
156
+
157
+ assert.strictEqual(receipt.revision, manifest.revision);
158
+ assert.deepStrictEqual(receipt.sectionsDelivered, ["section-1"]);
159
+ });
160
+
161
+ it("should reject acknowledgement of wrong revision", async () => {
162
+ const store = getPolicyStore();
163
+ const sessionId = "session-wrong-rev-" + randomUUID().slice(0, 8);
164
+
165
+ writeFileSync(AGENTS_MD, "# Agents v1\n\nContent.", "utf8");
166
+
167
+ const loader = new PolicyLoader({
168
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
169
+ });
170
+
171
+ const manifest1 = await loader.load(TEST_DIR);
172
+ store.noteDelivered(sessionId, manifest1, "system_prompt");
173
+
174
+ // Update content
175
+ writeFileSync(AGENTS_MD, "# Agents v2\n\nDifferent content.", "utf8");
176
+ loader.invalidateCache(TEST_DIR);
177
+ const manifest2 = await loader.load(TEST_DIR);
178
+
179
+ // Old receipt should NOT cover new manifest
180
+ const hasCoverage = store.hasValidReceipt(sessionId, manifest2);
181
+ assert.strictEqual(hasCoverage, false);
182
+ });
183
+ });
184
+
185
+ // --- Trust Evaluation Tests ---
186
+ describe("Trust evaluation", () => {
187
+ it("should evaluate trust appropriately", async () => {
188
+ // Create a .git directory (indicates repository)
189
+ mkdirSync(join(TEST_DIR, ".git"), { recursive: true });
190
+
191
+ const loader = new PolicyLoader({
192
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
193
+ });
194
+
195
+ const manifest = await loader.load(TEST_DIR);
196
+
197
+ // Trust should be evaluated
198
+ assert.ok(["trusted", "untrusted", "unknown"].includes(manifest.trust));
199
+
200
+ // Clean up
201
+ rmSync(join(TEST_DIR, ".git"), { recursive: true, force: true });
202
+ });
203
+ });
204
+
205
+ // --- Compaction Recovery Tests ---
206
+ describe("Compaction recovery", () => {
207
+ it("should invalidate receipts on session_compact event", async () => {
208
+ const store = getPolicyStore();
209
+ const sessionId = "session-compact-" + randomUUID().slice(0, 8);
210
+
211
+ writeFileSync(AGENTS_MD, "# Agents\n\nContent.", "utf8");
212
+
213
+ const loader = new PolicyLoader({
214
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
215
+ });
216
+
217
+ const manifest = await loader.load(TEST_DIR);
218
+ store.noteDelivered(sessionId, manifest, "system_prompt");
219
+
220
+ // Simulate compaction: invalidate all
221
+ store.invalidateAll();
222
+
223
+ // Receipt should be gone
224
+ const receipt = store.getReceipt(sessionId, TEST_DIR);
225
+ assert.strictEqual(receipt, null);
226
+ });
227
+ });
228
+
229
+ // --- Nested Scope Tests ---
230
+ describe("Nested scope resolution", () => {
231
+ it("should load scoped rules for subdirectories", async () => {
232
+ // Create nested structure
233
+ mkdirSync(join(TEST_DIR, "packages", "my-pkg"), { recursive: true });
234
+ writeFileSync(AGENTS_MD, "# Root Agents\n\nRoot rules.", "utf8");
235
+ writeFileSync(join(TEST_DIR, "packages", "AGENTS.md"), "# Package Agents\n\nPackage rules.", "utf8");
236
+
237
+ const loader = new PolicyLoader({
238
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
239
+ });
240
+
241
+ const manifest = await loader.load(TEST_DIR);
242
+
243
+ // Should have both root and package rules
244
+ assert.ok(manifest.sources.length >= 2, "Should include both root and package rules");
245
+
246
+ // Clean up nested structure
247
+ rmSync(join(TEST_DIR, "packages"), { recursive: true, force: true });
248
+ });
249
+ });
250
+
251
+ // --- Delivery Deduplication Tests ---
252
+ describe("Delivery deduplication", () => {
253
+ it("should not create duplicate receipts in same session", async () => {
254
+ const store = getPolicyStore();
255
+ const sessionId = "session-dedup-" + randomUUID().slice(0, 8);
256
+
257
+ writeFileSync(AGENTS_MD, "# Agents\n\nContent.", "utf8");
258
+
259
+ const loader = new PolicyLoader({
260
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
261
+ });
262
+
263
+ const manifest = await loader.load(TEST_DIR);
264
+
265
+ // First delivery
266
+ const receipt1 = store.noteDelivered(sessionId, manifest, "system_prompt");
267
+
268
+ // Second delivery should update, not create duplicate
269
+ const receipt2 = store.noteDelivered(sessionId, manifest, "system_prompt");
270
+
271
+ // Should be same session
272
+ assert.strictEqual(receipt1.sessionId, receipt2.sessionId);
273
+
274
+ // Should have same revision
275
+ assert.strictEqual(receipt1.revision, receipt2.revision);
276
+ });
277
+ });
278
+
279
+ // --- Partial Read Tracking Tests ---
280
+ describe("Partial read tracking", () => {
281
+ it("should track which sections were actually delivered", async () => {
282
+ const store = getPolicyStore();
283
+ const sessionId = "session-partial-" + randomUUID().slice(0, 8);
284
+
285
+ writeFileSync(AGENTS_MD, "# Agents\n\n## Section 1\n\nContent 1.\n\n## Section 2\n\nContent 2.", "utf8");
286
+
287
+ const loader = new PolicyLoader({
288
+ harnessRulesPath: new URL(`file://${AGENTS_MD}`),
289
+ });
290
+
291
+ const manifest = await loader.load(TEST_DIR);
292
+
293
+ // Note partial delivery (only section 1)
294
+ const receipt = store.noteDelivered(sessionId, manifest, "tool", ["section-1"]);
295
+
296
+ assert.deepStrictEqual(receipt.sectionsDelivered, ["section-1"]);
297
+ });
298
+ });
299
+ });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/architecture-generator",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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": "@pi-harness/codex-watcher",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
4
4
  "description": "Watches Codex CLI sessions and emits visible messages for PING-PONG monitoring",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/config-capture",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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": "@moocoding/durable-review",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
4
4
  "description": "SQLite-backed durable reviewer using @earendil-works/pi-durable",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/e2e-tester",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
4
4
  "description": "WebMCP-powered E2E testing for pi-harness - natural language test scenarios",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
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.320",
3
+ "version": "1.1.321",
4
4
  "description": "Frappe/ERPNext framework analysis — DocTypes, hooks, bench sites, site config",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/generic-web-plugin",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
4
4
  "description": "Generic web framework analysis — REST/GraphQL endpoints, OpenAPI, auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/health-monitor",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
4
4
  "type": "module",
5
5
  "description": "Health monitoring and auto-healing",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/intent-analyzer",
3
- "version": "1.1.320",
3
+ "version": "1.1.321",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {