pi-harness-runtime 1.1.88 → 1.1.90

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 (108) hide show
  1. package/index.ts +1 -1
  2. package/package.json +1 -1
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/architecture-generator/package.json +1 -1
  5. package/packages/auth/package.json +1 -1
  6. package/packages/autonomous-refactor/package.json +1 -1
  7. package/packages/autonomous-runtime/package.json +1 -1
  8. package/packages/cache-strategy/package.json +1 -1
  9. package/packages/capability-registry/package.json +1 -1
  10. package/packages/checkpoint/package.json +1 -1
  11. package/packages/cli-plugin-sdk/package.json +1 -1
  12. package/packages/clipboard/package.json +1 -1
  13. package/packages/clipboard-plugin/package.json +1 -1
  14. package/packages/code-generation/package.json +1 -1
  15. package/packages/code-review/package.json +1 -1
  16. package/packages/codex-adapter/package.json +1 -1
  17. package/packages/config-capture/package.json +1 -1
  18. package/packages/context-compiler/package.json +1 -1
  19. package/packages/context-discovery/package.json +1 -1
  20. package/packages/context-manager/package.json +1 -1
  21. package/packages/cookie-sanitizer/package.json +1 -1
  22. package/packages/cost-optimizer/package.json +1 -1
  23. package/packages/dependency-analyzer/package.json +1 -1
  24. package/packages/django-plugin/package.json +1 -1
  25. package/packages/doc-generator/package.json +1 -1
  26. package/packages/evaluation-engine/package.json +1 -1
  27. package/packages/evaluation-runner/package.json +1 -1
  28. package/packages/event-bus/package.json +1 -1
  29. package/packages/event-store/package.json +1 -1
  30. package/packages/experience-replay/package.json +1 -1
  31. package/packages/feedback-collector/package.json +1 -1
  32. package/packages/file-copy-helper/package.json +1 -1
  33. package/packages/framework-detector/package.json +1 -1
  34. package/packages/framework-plugin-sdk/package.json +1 -1
  35. package/packages/frappe-plugin/package.json +1 -1
  36. package/packages/generic-web-plugin/package.json +1 -1
  37. package/packages/health-monitor/package.json +1 -1
  38. package/packages/intent-analyzer/package.json +1 -1
  39. package/packages/jev-judge/dist/environment-judge.d.ts +65 -0
  40. package/packages/jev-judge/dist/environment-judge.d.ts.map +1 -0
  41. package/packages/jev-judge/dist/environment-judge.js +198 -0
  42. package/packages/jev-judge/dist/environment-judge.js.map +1 -0
  43. package/packages/jev-judge/dist/index.d.ts +4 -0
  44. package/packages/jev-judge/dist/index.d.ts.map +1 -1
  45. package/packages/jev-judge/dist/index.js +5 -1
  46. package/packages/jev-judge/dist/index.js.map +1 -1
  47. package/packages/jev-judge/dist/wrap-up-judge.d.ts +27 -0
  48. package/packages/jev-judge/dist/wrap-up-judge.d.ts.map +1 -0
  49. package/packages/jev-judge/dist/wrap-up-judge.js +45 -0
  50. package/packages/jev-judge/dist/wrap-up-judge.js.map +1 -0
  51. package/packages/jev-judge/package.json +1 -1
  52. package/packages/jev-judge/src/environment-judge.ts +271 -0
  53. package/packages/jev-judge/src/index.ts +9 -1
  54. package/packages/jev-judge/src/wrap-up-judge.ts +65 -0
  55. package/packages/knowledge-graph/package.json +1 -1
  56. package/packages/knowledge-retrieval/package.json +1 -1
  57. package/packages/laravel-plugin/package.json +1 -1
  58. package/packages/learning-engine/package.json +1 -1
  59. package/packages/mcp-adapter/package.json +1 -1
  60. package/packages/memory-engine/package.json +1 -1
  61. package/packages/milestone-manager/package.json +1 -1
  62. package/packages/model-registry/package.json +1 -1
  63. package/packages/nextjs-plugin/package.json +1 -1
  64. package/packages/notification/package.json +1 -1
  65. package/packages/observability/package.json +1 -1
  66. package/packages/okf-indexer/package.json +1 -1
  67. package/packages/performance-optimizer/package.json +1 -1
  68. package/packages/privilege-broker/package.json +1 -1
  69. package/packages/project-analyzer/package.json +1 -1
  70. package/packages/project-bootstrap/package.json +1 -1
  71. package/packages/projection-engine/package.json +1 -1
  72. package/packages/prompt-compiler/package.json +1 -1
  73. package/packages/prompt-versioning/package.json +1 -1
  74. package/packages/provider-adapter-sdk/package.json +1 -1
  75. package/packages/provider-router/package.json +1 -1
  76. package/packages/provider-selector/package.json +1 -1
  77. package/packages/providers/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/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/trajectory/package.json +1 -1
  103. package/packages/tui/package.json +1 -1
  104. package/packages/types/package.json +1 -1
  105. package/packages/workflow-events/package.json +1 -1
  106. package/packages/workspace-scanner/package.json +1 -1
  107. package/packages/worktree/package.json +1 -1
  108. package/packages/write-review/package.json +1 -1
package/index.ts CHANGED
@@ -92,7 +92,7 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
92
92
 
93
93
  if (!hasEnvKey && !hasFileKey) {
94
94
  console.log(
95
- "[auto-continue] No Jev API key found. Run: echo \"{api_key}\" > ~/.pi-harness-runtime/keys/jev-api-key.txt"
95
+ "[auto-continue] No Jev API key found. Set TYPESAFE_API_KEY run: echo \"{api_key}\" > ~/.pi-harness-runtime/keys/jev-api-key.txt"
96
96
  );
97
97
  return;
98
98
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-harness-runtime",
3
- "version": "1.1.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
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.88",
3
+ "version": "1.1.90",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Environment Judge - Verify environment before destructive operations
3
+ *
4
+ * Uses Jev to determine if agent is running on Dev or Prod server
5
+ * and whether it's safe to run build/restart commands.
6
+ *
7
+ * Problem: Agent gets confused and tries SSH to server it's already on.
8
+ * Solution: Jev analyzes environment context to guide safe operations.
9
+ */
10
+ /**
11
+ * Environment context
12
+ */
13
+ export interface EnvironmentContext {
14
+ hostname?: string;
15
+ currentPath?: string;
16
+ isRemoteSession?: boolean;
17
+ hasSSHConnection?: boolean;
18
+ gitRemote?: string;
19
+ isProduction?: boolean;
20
+ }
21
+ /**
22
+ * Environment decision result
23
+ */
24
+ export interface EnvironmentDecision {
25
+ isLocal: boolean;
26
+ isRemote: boolean;
27
+ likelyServer?: "dev" | "prod" | "unknown";
28
+ confidence: "high" | "medium" | "low";
29
+ reasoning: string;
30
+ warnings: string[];
31
+ recommendedActions: string[];
32
+ }
33
+ /**
34
+ * Build/restart safety check
35
+ */
36
+ export interface SafetyCheck {
37
+ safe: boolean;
38
+ isLocal: boolean;
39
+ targetServer?: "dev" | "prod" | "unknown";
40
+ warnings: string[];
41
+ requiresConfirmation: boolean;
42
+ recommendedCommand?: string;
43
+ }
44
+ /**
45
+ * Environment Judge configuration
46
+ */
47
+ export interface EnvironmentConfig {
48
+ devPatterns?: string[];
49
+ prodPatterns?: string[];
50
+ }
51
+ export declare class EnvironmentJudge {
52
+ private jev?;
53
+ private config;
54
+ constructor(config?: EnvironmentConfig);
55
+ analyze(context?: EnvironmentContext): Promise<EnvironmentDecision>;
56
+ checkBuildSafety(context?: EnvironmentContext): Promise<SafetyCheck>;
57
+ checkSSHCommand(host: string, command: string): Promise<SafetyCheck>;
58
+ private detectEnvironment;
59
+ private detectProduction;
60
+ private isLocalHost;
61
+ private guessServer;
62
+ private makeDecision;
63
+ private fallbackDecision;
64
+ }
65
+ //# sourceMappingURL=environment-judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-judge.d.ts","sourceRoot":"","sources":["../src/environment-judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAOD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAC,CAAW;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,YAAY,MAAM,GAAE,iBAAsB,EAczC;IAEK,OAAO,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAGxE;IAEK,gBAAgB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAoBzE;IAEK,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCzE;YAEa,iBAAiB;IA0B/B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;YAOL,YAAY;IAiD1B,OAAO,CAAC,gBAAgB;CA4BzB"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Environment Judge - Verify environment before destructive operations
3
+ *
4
+ * Uses Jev to determine if agent is running on Dev or Prod server
5
+ * and whether it's safe to run build/restart commands.
6
+ *
7
+ * Problem: Agent gets confused and tries SSH to server it's already on.
8
+ * Solution: Jev analyzes environment context to guide safe operations.
9
+ */
10
+ import { JevJudge, getApiKeyFromEnv } from "./index.js";
11
+ const DEFAULT_CONFIG = {
12
+ devPatterns: ["dev", "staging", "test", "local"],
13
+ prodPatterns: ["prod", "production", "live", "主站"],
14
+ };
15
+ export class EnvironmentJudge {
16
+ jev;
17
+ config;
18
+ constructor(config = {}) {
19
+ this.config = {
20
+ devPatterns: config.devPatterns ?? DEFAULT_CONFIG.devPatterns,
21
+ prodPatterns: config.prodPatterns ?? DEFAULT_CONFIG.prodPatterns,
22
+ };
23
+ const apiKey = getApiKeyFromEnv();
24
+ if (apiKey) {
25
+ try {
26
+ this.jev = new JevJudge({ apiKey });
27
+ }
28
+ catch {
29
+ // Jev not available
30
+ }
31
+ }
32
+ }
33
+ async analyze(context) {
34
+ const ctx = context ?? (await this.detectEnvironment());
35
+ return this.makeDecision(ctx);
36
+ }
37
+ async checkBuildSafety(context) {
38
+ const env = await this.analyze(context);
39
+ const warnings = [];
40
+ if (!env.isLocal) {
41
+ warnings.push(`Running on remote server (${env.likelyServer ?? "unknown"})`);
42
+ }
43
+ if (env.likelyServer === "prod") {
44
+ warnings.push("⚠️ WARNING: This appears to be a PRODUCTION server!");
45
+ }
46
+ return {
47
+ safe: env.likelyServer !== "prod",
48
+ isLocal: env.isLocal,
49
+ targetServer: env.likelyServer,
50
+ warnings,
51
+ requiresConfirmation: env.likelyServer === "prod",
52
+ recommendedCommand: env.isLocal ? "build locally" : `ssh to target server first, then build`,
53
+ };
54
+ }
55
+ async checkSSHCommand(host, command) {
56
+ const env = await this.analyze();
57
+ const isLocalHost = this.isLocalHost(host);
58
+ if (isLocalHost && env.isLocal) {
59
+ return {
60
+ safe: true,
61
+ isLocal: true,
62
+ targetServer: env.likelyServer,
63
+ warnings: [],
64
+ requiresConfirmation: false,
65
+ };
66
+ }
67
+ if (isLocalHost && !env.isLocal) {
68
+ return {
69
+ safe: false,
70
+ isLocal: false,
71
+ targetServer: env.likelyServer,
72
+ warnings: [
73
+ `⚠️ You're already on this server via SSH!`,
74
+ `Running '${command}' directly would be more efficient.`,
75
+ ],
76
+ requiresConfirmation: true,
77
+ recommendedCommand: command,
78
+ };
79
+ }
80
+ return {
81
+ safe: true,
82
+ isLocal: false,
83
+ targetServer: this.guessServer(host),
84
+ warnings: [],
85
+ requiresConfirmation: false,
86
+ };
87
+ }
88
+ async detectEnvironment() {
89
+ const os = await import("os");
90
+ const hostname = os.hostname();
91
+ const cwd = process.cwd();
92
+ const sshConnection = process.env.SSH_CONNECTION || process.env.SSH_CLIENT;
93
+ const hasSSHConnection = !!(sshConnection);
94
+ let gitRemote = "";
95
+ try {
96
+ const { execSync } = await import("child_process");
97
+ gitRemote = execSync("git remote get-url origin 2>/dev/null || echo ''", { encoding: "utf8" }).trim();
98
+ }
99
+ catch {
100
+ // Ignore
101
+ }
102
+ return {
103
+ hostname,
104
+ currentPath: cwd,
105
+ isRemoteSession: hasSSHConnection,
106
+ hasSSHConnection,
107
+ gitRemote,
108
+ isProduction: this.detectProduction(hostname),
109
+ };
110
+ }
111
+ detectProduction(hostname) {
112
+ const lower = hostname.toLowerCase();
113
+ return (this.config.prodPatterns.some((p) => lower.includes(p)) ||
114
+ /^(prod|production|live|主站)/.test(hostname));
115
+ }
116
+ isLocalHost(host) {
117
+ const hostname = process.env.HOSTNAME || "unknown";
118
+ const localhosts = ["localhost", "127.0.0.1", "0.0.0.0", hostname];
119
+ return localhosts.some((l) => host.includes(l));
120
+ }
121
+ guessServer(host) {
122
+ const lower = host.toLowerCase();
123
+ if (this.config.prodPatterns.some((p) => lower.includes(p)))
124
+ return "prod";
125
+ if (this.config.devPatterns.some((p) => lower.includes(p)))
126
+ return "dev";
127
+ return "unknown";
128
+ }
129
+ async makeDecision(ctx) {
130
+ if (!this.jev) {
131
+ return this.fallbackDecision(ctx);
132
+ }
133
+ try {
134
+ const result = await this.jev.evaluate(ctx, {
135
+ isLocal: {
136
+ type: "noul",
137
+ instructions: "Is the agent running on a local machine or a remote server?",
138
+ },
139
+ serverType: {
140
+ type: "choice",
141
+ instructions: "What type of server is this?",
142
+ options: ["dev", "prod", "unknown"],
143
+ },
144
+ safeToBuild: {
145
+ type: "noul",
146
+ instructions: "Is it safe to run build/restart commands on this environment?",
147
+ },
148
+ });
149
+ const isLocalScore = result.decisions.isLocal?.response?.noul ?? 0.5;
150
+ const serverType = result.decisions.serverType?.response?.choice ?? "unknown";
151
+ const safeToBuild = result.decisions.safeToBuild?.response?.noul ?? 0.5 > 0.5;
152
+ const warnings = [];
153
+ const recommendedActions = [];
154
+ if (serverType === "prod" && !safeToBuild) {
155
+ warnings.push("⚠️ Production server - confirm before destructive actions");
156
+ recommendedActions.push("Request explicit user confirmation");
157
+ }
158
+ return {
159
+ isLocal: isLocalScore > 0.5,
160
+ isRemote: isLocalScore <= 0.5,
161
+ likelyServer: serverType,
162
+ confidence: "medium",
163
+ reasoning: "Jev analysis complete",
164
+ warnings,
165
+ recommendedActions,
166
+ };
167
+ }
168
+ catch (error) {
169
+ console.error("[EnvironmentJudge] Jev call failed:", error);
170
+ return this.fallbackDecision(ctx);
171
+ }
172
+ }
173
+ fallbackDecision(ctx) {
174
+ const hostname = ctx.hostname ?? "unknown";
175
+ const isProduction = this.detectProduction(hostname);
176
+ const isLocal = !ctx.isRemoteSession && !ctx.hasSSHConnection;
177
+ const warnings = [];
178
+ const recommendedActions = [];
179
+ if (isProduction) {
180
+ warnings.push("⚠️ This appears to be a PRODUCTION server!");
181
+ recommendedActions.push("Confirm with user before build/restart");
182
+ }
183
+ if (!isLocal) {
184
+ warnings.push(`Running on remote server: ${hostname}`);
185
+ recommendedActions.push("Verify target server before SSH commands");
186
+ }
187
+ return {
188
+ isLocal,
189
+ isRemote: !isLocal,
190
+ likelyServer: isProduction ? "prod" : "dev",
191
+ confidence: isProduction ? "high" : "medium",
192
+ reasoning: `Fallback: hostname=${hostname}, remote=${!isLocal}`,
193
+ warnings,
194
+ recommendedActions,
195
+ };
196
+ }
197
+ }
198
+ //# sourceMappingURL=environment-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-judge.js","sourceRoot":"","sources":["../src/environment-judge.ts"],"names":[],"mappings":"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"}
@@ -95,4 +95,8 @@ export { FlakyDetector } from "./flaky-detector.js";
95
95
  export { DecisionEngine } from "./decision-engine.js";
96
96
  export { AutoContinueJudge, createTaskState } from "./auto-continue.js";
97
97
  export type { TaskState, AutoContinueDecision, AutoContinueConfig } from "./auto-continue.js";
98
+ export { checkWrapUp, getTodoSummary } from "./wrap-up-judge.js";
99
+ export type { TodoItem, WrapUpResult } from "./wrap-up-judge.js";
100
+ export { EnvironmentJudge } from "./environment-judge.js";
101
+ export type { EnvironmentContext, EnvironmentDecision, SafetyCheck, EnvironmentConfig } from "./environment-judge.js";
98
102
  //# sourceMappingURL=index.d.ts.map