pi-harness-runtime 1.1.435 → 1.1.437

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 (122) hide show
  1. package/harness/key-file-audit.ts +103 -3
  2. package/harness/startup-report.ts +32 -1
  3. package/index.ts +28 -0
  4. package/package.json +2 -1
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/agent-policy/package.json +1 -1
  7. package/packages/architecture-generator/package.json +1 -1
  8. package/packages/auth/package.json +1 -1
  9. package/packages/autonomous-refactor/package.json +1 -1
  10. package/packages/autonomous-runtime/package.json +1 -1
  11. package/packages/cache-strategy/package.json +1 -1
  12. package/packages/capability-registry/package.json +1 -1
  13. package/packages/checkpoint/package.json +1 -1
  14. package/packages/cli-plugin-sdk/package.json +1 -1
  15. package/packages/clipboard/package.json +1 -1
  16. package/packages/clipboard-plugin/package.json +1 -1
  17. package/packages/code-generation/package.json +1 -1
  18. package/packages/code-review/package.json +1 -1
  19. package/packages/codex-adapter/package.json +1 -1
  20. package/packages/codex-watcher/package.json +1 -1
  21. package/packages/config-capture/package.json +1 -1
  22. package/packages/connection-runtime/package.json +1 -1
  23. package/packages/context-compiler/package.json +1 -1
  24. package/packages/context-discovery/package.json +1 -1
  25. package/packages/context-manager/package.json +1 -1
  26. package/packages/contracts/package.json +1 -1
  27. package/packages/cookie-sanitizer/package.json +1 -1
  28. package/packages/cost-optimizer/package.json +1 -1
  29. package/packages/dependency-analyzer/package.json +1 -1
  30. package/packages/django-plugin/package.json +1 -1
  31. package/packages/doc-generator/package.json +1 -1
  32. package/packages/durable-review/package.json +1 -1
  33. package/packages/e2e-tester/package.json +1 -1
  34. package/packages/evaluation-engine/package.json +1 -1
  35. package/packages/evaluation-runner/package.json +1 -1
  36. package/packages/event-bus/package.json +1 -1
  37. package/packages/event-sink/package.json +1 -1
  38. package/packages/event-store/package.json +1 -1
  39. package/packages/experience-replay/package.json +1 -1
  40. package/packages/feedback-collector/package.json +1 -1
  41. package/packages/file-copy-helper/package.json +1 -1
  42. package/packages/framework-detector/package.json +1 -1
  43. package/packages/framework-plugin-sdk/package.json +1 -1
  44. package/packages/frappe-plugin/package.json +1 -1
  45. package/packages/generic-web-plugin/package.json +1 -1
  46. package/packages/health-monitor/package.json +1 -1
  47. package/packages/intent-analyzer/package.json +1 -1
  48. package/packages/jev-judge/package.json +1 -1
  49. package/packages/knowledge-graph/package.json +1 -1
  50. package/packages/knowledge-retrieval/package.json +1 -1
  51. package/packages/laravel-plugin/package.json +1 -1
  52. package/packages/learning-engine/package.json +1 -1
  53. package/packages/logging/package.json +1 -1
  54. package/packages/mcp-adapter/package.json +1 -1
  55. package/packages/memory-engine/package.json +1 -1
  56. package/packages/milestone-manager/package.json +1 -1
  57. package/packages/model-registry/package.json +1 -1
  58. package/packages/nextjs-plugin/package.json +1 -1
  59. package/packages/notification/package.json +1 -1
  60. package/packages/observability/package.json +1 -1
  61. package/packages/okf-indexer/package.json +1 -1
  62. package/packages/paperclip-integration/package.json +1 -1
  63. package/packages/performance-optimizer/package.json +1 -1
  64. package/packages/permission-mode/package.json +1 -1
  65. package/packages/privilege-broker/package.json +1 -1
  66. package/packages/project-analyzer/package.json +1 -1
  67. package/packages/project-bootstrap/package.json +1 -1
  68. package/packages/projection-engine/package.json +1 -1
  69. package/packages/prompt-compiler/package.json +1 -1
  70. package/packages/prompt-versioning/package.json +1 -1
  71. package/packages/provider-adapter-sdk/package.json +1 -1
  72. package/packages/provider-router/package.json +1 -1
  73. package/packages/provider-selector/package.json +1 -1
  74. package/packages/providers/package.json +1 -1
  75. package/packages/qdrant-skills/package.json +1 -1
  76. package/packages/quota-manager/package.json +1 -1
  77. package/packages/rate-limiter/package.json +1 -1
  78. package/packages/react-vite-plugin/package.json +1 -1
  79. package/packages/relay/package.json +1 -1
  80. package/packages/release-manager/package.json +1 -1
  81. package/packages/requirement-compiler/package.json +1 -1
  82. package/packages/runtime/package.json +1 -1
  83. package/packages/scheduler/package.json +1 -1
  84. package/packages/scheduler-adapter/package.json +1 -1
  85. package/packages/session/package.json +1 -1
  86. package/packages/session-api/package.json +1 -1
  87. package/packages/session-export/package.json +1 -1
  88. package/packages/shared-context/package.json +1 -1
  89. package/packages/skill-mcp-client/package.json +1 -1
  90. package/packages/skill-registry/package.json +1 -1
  91. package/packages/skills/package.json +1 -1
  92. package/packages/sprint-planner/package.json +1 -1
  93. package/packages/subscription-engine/package.json +1 -1
  94. package/packages/task-compiler/package.json +1 -1
  95. package/packages/tencentdb-memory/package.json +1 -1
  96. package/packages/tencentdb-sync/package.json +1 -1
  97. package/packages/test-data-generator/package.json +1 -1
  98. package/packages/test-generator/package.json +1 -1
  99. package/packages/todo-bd-sync/package.json +1 -1
  100. package/packages/token-estimation/package.json +1 -1
  101. package/packages/token-optimizer/package.json +1 -1
  102. package/packages/tooling-preference/package.json +1 -1
  103. package/packages/trajectory/package.json +1 -1
  104. package/packages/tui/package.json +1 -1
  105. package/packages/two-phase-review/package.json +1 -1
  106. package/packages/types/package.json +1 -1
  107. package/packages/voice-api/package.json +1 -1
  108. package/packages/webmcp-tester/package.json +1 -1
  109. package/packages/wiki/package.json +1 -1
  110. package/packages/workflow-events/package.json +1 -1
  111. package/packages/workspace-scanner/package.json +1 -1
  112. package/packages/worktree/package.json +1 -1
  113. package/packages/write-review/package.json +1 -1
  114. package/scripts/check-sensitive-terms.d.mts +116 -0
  115. package/scripts/check-sensitive-terms.mjs +764 -0
  116. package/scripts/guard-scan.sh +102 -0
  117. package/scripts/release/adapters/node-workspace.ts +1 -3
  118. package/scripts/release/orchestrator.ts +11 -5
  119. package/scripts/release/tsconfig.json +11 -0
  120. package/scripts/typecheck-packages.mjs +15 -2
  121. package/scripts/verify-package-contents.ts +69 -1
  122. package/scripts/tsconfig.json +0 -9
@@ -15,7 +15,7 @@
15
15
  * state of a file (missing / empty).
16
16
  */
17
17
 
18
- import { existsSync, readFileSync } from "node:fs";
18
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
19
19
  import { homedir } from "node:os";
20
20
  import { join } from "node:path";
21
21
 
@@ -303,6 +303,22 @@ function isDerivableWebhookUrl(value: string): boolean {
303
303
  }
304
304
  }
305
305
 
306
+ /**
307
+ * A key file that other users on this machine can read.
308
+ *
309
+ * A key file is a secret. A secret that the group or the others can read
310
+ * is not a secret - it is published to every account on the machine. The
311
+ * audit does not read the content of such a file; it looks at the mode.
312
+ */
313
+ export interface ExposedKeyFile {
314
+ /** The name of the file, relative to the key directory. */
315
+ file: string;
316
+ /** The mode of the file, as an octal string ("644"). */
317
+ mode: string;
318
+ /** Who can read the file besides the owner. */
319
+ readableBy: "group" | "others" | "group and others";
320
+ }
321
+
306
322
  export interface KeyFileAuditOptions {
307
323
  /** The key directory to scan (e.g. ~/.pi-harness-runtime/keys). */
308
324
  keysDir: string;
@@ -312,6 +328,10 @@ export interface KeyFileAuditOptions {
312
328
  readFile?: (path: string) => string | undefined;
313
329
  /** Existence check override (used by the tests). */
314
330
  exists?: (path: string) => boolean;
331
+ /** Directory reader override (used by the tests). */
332
+ readdir?: (path: string) => string[];
333
+ /** File information override (used by the tests). */
334
+ stat?: (path: string) => { mode: number; isFile: boolean } | undefined;
315
335
  }
316
336
 
317
337
  export interface KeyFileAuditResult {
@@ -319,6 +339,61 @@ export interface KeyFileAuditResult {
319
339
  missing: MissingCredential[];
320
340
  /** The unresolved credentials grouped by their owning feature. */
321
341
  byFeature: Map<string, MissingCredential[]>;
342
+ /** The key files that other users on this machine can read. */
343
+ exposed: ExposedKeyFile[];
344
+ }
345
+
346
+ /**
347
+ * The key files that other users on this machine can read.
348
+ *
349
+ * A key file with the mode 600 is a secret. Every other bit in the group
350
+ * or the others column publishes it to the accounts on the machine, and
351
+ * nothing in the harness notices - the file is read successfully by the
352
+ * owner, so nothing fails and nothing is reported.
353
+ *
354
+ * The whole directory is scanned, not only the files of the inventory: a
355
+ * key file that the inventory does not know yet is a secret too.
356
+ */
357
+ export function scanExposedKeyFiles(options: KeyFileAuditOptions): ExposedKeyFile[] {
358
+ const readdir =
359
+ options.readdir ??
360
+ ((path: string) => {
361
+ try {
362
+ return readdirSync(path);
363
+ } catch {
364
+ return [];
365
+ }
366
+ });
367
+ const stat =
368
+ options.stat ??
369
+ ((path: string) => {
370
+ try {
371
+ const info = statSync(path);
372
+ return { mode: info.mode & 0o777, isFile: info.isFile() };
373
+ } catch {
374
+ return undefined;
375
+ }
376
+ });
377
+
378
+ const exposed: ExposedKeyFile[] = [];
379
+ for (const name of readdir(options.keysDir).sort()) {
380
+ const info = stat(join(options.keysDir, name));
381
+ if (!info || !info.isFile) continue;
382
+ const group = info.mode & 0o070;
383
+ const others = info.mode & 0o007;
384
+ if (group === 0 && others === 0) continue;
385
+ exposed.push({
386
+ file: name,
387
+ mode: info.mode.toString(8).padStart(3, "0"),
388
+ readableBy:
389
+ group !== 0 && others !== 0
390
+ ? "group and others"
391
+ : group !== 0
392
+ ? "group"
393
+ : "others",
394
+ });
395
+ }
396
+ return exposed;
322
397
  }
323
398
 
324
399
  /**
@@ -396,10 +471,35 @@ export function auditKeyFiles(options: KeyFileAuditOptions): KeyFileAuditResult
396
471
  byFeature.set(entry.requirement.feature, list);
397
472
  }
398
473
 
399
- return { missing, byFeature };
474
+ return { missing, byFeature, exposed: scanExposedKeyFiles(options) };
475
+ }
476
+
477
+ /**
478
+ * The command that makes a key file private again.
479
+ *
480
+ * The file keeps its content - the command changes the mode, not the
481
+ * value.
482
+ */
483
+ export function formatExposedKeyFileFix(
484
+ entry: ExposedKeyFile,
485
+ keysDir: string,
486
+ ): string {
487
+ return `chmod 600 ${join(displayKeysDir(keysDir), entry.file)}`;
400
488
  }
401
489
 
402
- /** The key directory as it is shown to the user (~ instead of the home path). */
490
+ /**
491
+ * The fix commands for every key file that other users can read.
492
+ */
493
+ export function formatExposedKeyFileFixes(
494
+ entries: ExposedKeyFile[] | undefined,
495
+ keysDir: string,
496
+ ): string[] {
497
+ if (!entries || entries.length === 0) return [];
498
+ return entries.map((entry) => formatExposedKeyFileFix(entry, keysDir));
499
+ }
500
+
501
+ /**
502
+ * The key directory as it is shown to the user (~ instead of the home path). */
403
503
  export function displayKeysDir(keysDir: string): string {
404
504
  const home = homedir();
405
505
  return keysDir.startsWith(home) ? join("~", keysDir.slice(home.length)) : keysDir;
@@ -11,7 +11,7 @@
11
11
  * - LINE must not be reported as configured when the audit could not run.
12
12
  */
13
13
 
14
- import type { KeyFileAuditResult } from "./key-file-audit.ts";
14
+ import type { ExposedKeyFile, KeyFileAuditResult } from "./key-file-audit.ts";
15
15
 
16
16
  export type StartupStatus = "wait" | "ok" | "info" | "warn" | "err";
17
17
 
@@ -141,6 +141,37 @@ export function relayEndpointReport(options: {
141
141
  };
142
142
  }
143
143
 
144
+ /**
145
+ * The line for key files that other users on this machine can read.
146
+ *
147
+ * A key file is a secret, and a secret that the group or the others can
148
+ * read is published to every account on the machine. Nothing else notices:
149
+ * the harness reads the file successfully, so no feature fails and no other
150
+ * line warns. This line is the only place where the fact can surface.
151
+ *
152
+ * The line names the count and the command. It never names a value.
153
+ */
154
+ export function exposedKeyFilesReport(options: {
155
+ /** The key files that other users can read. */
156
+ exposed: ExposedKeyFile[];
157
+ /** The `chmod` command for each of them. */
158
+ fixes: string[];
159
+ }): StartupReport | null {
160
+ if (options.exposed.length === 0) return null;
161
+ const count = options.exposed.length;
162
+ const text =
163
+ count === 1
164
+ ? "1 key file can be read by other users on this machine"
165
+ : `${count} key files can be read by other users on this machine`;
166
+ const details = [...options.fixes];
167
+ if (details.length === 0) {
168
+ details.push(
169
+ "Make the key directory private: chmod 700 ~/.pi-harness-runtime/keys",
170
+ );
171
+ }
172
+ return { label: "Keys", text, status: "warn", details };
173
+ }
174
+
144
175
  /**
145
176
  * The two steps that create a usable LINE channel.
146
177
  *
package/index.ts CHANGED
@@ -23,6 +23,7 @@ import { HarnessStartupStatus, harnessStatusMarker, type HarnessStatus } from ".
23
23
  import {
24
24
  auditKeyFiles,
25
25
  fallbackKeyFileFixes,
26
+ formatExposedKeyFileFixes,
26
27
  formatKeyFileFixes,
27
28
  selectKeyFileFixes,
28
29
  type KeyFileAuditResult,
@@ -32,6 +33,7 @@ import { describeInboundAccess, getAllowedUserIds } from "./harness/telegram-aut
32
33
  import { buildTelegramCallbackUpdate, buildTelegramMessageUpdate } from "./harness/telegram-update.ts";
33
34
  import { installConsoleGuard } from "./harness/console-guard.ts";
34
35
  import {
36
+ exposedKeyFilesReport,
35
37
  jevMissingKeyReport,
36
38
  lineConfigurationReport,
37
39
  oneLineError,
@@ -200,6 +202,26 @@ function getKeyFileAudit(): KeyFileAuditResult | null {
200
202
  return keyFileAudit;
201
203
  }
202
204
 
205
+ /**
206
+ * Report the key files that other users on this machine can read.
207
+ *
208
+ * A key file is a secret. The harness reads its own key files, so a file
209
+ * that the group or the others can read works perfectly - and is published
210
+ * to every account on the machine. No other line notices, so this is the
211
+ * only place where the fact can surface.
212
+ */
213
+ function reportExposedKeyFiles(): void {
214
+ const audit = getKeyFileAudit();
215
+ const exposed = audit?.exposed ?? [];
216
+ if (exposed.length === 0) return;
217
+ const report = exposedKeyFilesReport({
218
+ exposed,
219
+ fixes: formatExposedKeyFileFixes(exposed, harnessKeysDir()),
220
+ });
221
+ if (!report) return;
222
+ addHarnessMessage(report.label, report.text, report.status, report.details);
223
+ }
224
+
203
225
  /**
204
226
  * The `echo` commands that create the missing key files of one feature.
205
227
  *
@@ -4240,6 +4262,11 @@ export default async function (pi: ExtensionAPI) {
4240
4262
  // Telegram is not configured at all - that is the fresh-install case.
4241
4263
  reportRelayConfiguration();
4242
4264
 
4265
+ // The key files that other users can read. The audit is read by
4266
+ // every other line, so this is the only place where a published
4267
+ // secret can surface.
4268
+ reportExposedKeyFiles();
4269
+
4243
4270
  // --- console-guard: keep the TUI prompt input field clean ----
4244
4271
  // A library that writes to the console would put its text into the
4245
4272
  // prompt input field. The guard sends it to the harness log instead.
@@ -6186,6 +6213,7 @@ Run \`bd ready\` to see current bd issues.
6186
6213
  keyFileAuditDone = false;
6187
6214
  reportRelayConfiguration();
6188
6215
  reportLineConfiguration();
6216
+ reportExposedKeyFiles();
6189
6217
  // Service states survive session changes; initialization runs once per extension load.
6190
6218
  harnessWidgetRegistered = false; // Reset for new session
6191
6219
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-harness-runtime",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
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": {
@@ -21,6 +21,7 @@
21
21
  "build": "bun scripts/build-packages.ts",
22
22
  "build:verify": "bun scripts/verify-package-contents.ts",
23
23
  "build:verify:pack": "bun scripts/verify-package-contents.ts --pack",
24
+ "guard:scan": "bash scripts/guard-scan.sh",
24
25
  "prepublishOnly": "bun run build && bun run build:verify:pack",
25
26
  "test:harness": "node scripts/run-langchain-tests.mjs",
26
27
  "test:packages": "bun test packages/",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/a2a-adapter",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
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/agent-policy",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
4
4
  "description": "Agent policy runtime for pi-harness - enforces mandatory rule delivery and mutation gating",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/architecture-generator",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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-harness/connection-runtime",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
4
4
  "type": "module",
5
5
  "description": "Connection management with jittered exponential backoff for pi-harness",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/context-compiler",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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/contracts",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
4
4
  "type": "module",
5
5
  "description": "RPC schema definitions for pi-harness runtime",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/cookie-sanitizer",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/event-sink",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
4
4
  "type": "module",
5
5
  "description": "Atomic event sourcing with SQLite transactions for pi-harness",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/event-store",
3
- "version": "1.1.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
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.435",
3
+ "version": "1.1.437",
4
4
  "description": "Generic web framework analysis — REST/GraphQL endpoints, OpenAPI, auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",