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.
- package/index.ts +1 -1
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/dist/environment-judge.d.ts +65 -0
- package/packages/jev-judge/dist/environment-judge.d.ts.map +1 -0
- package/packages/jev-judge/dist/environment-judge.js +198 -0
- package/packages/jev-judge/dist/environment-judge.js.map +1 -0
- package/packages/jev-judge/dist/index.d.ts +4 -0
- package/packages/jev-judge/dist/index.d.ts.map +1 -1
- package/packages/jev-judge/dist/index.js +5 -1
- package/packages/jev-judge/dist/index.js.map +1 -1
- package/packages/jev-judge/dist/wrap-up-judge.d.ts +27 -0
- package/packages/jev-judge/dist/wrap-up-judge.d.ts.map +1 -0
- package/packages/jev-judge/dist/wrap-up-judge.js +45 -0
- package/packages/jev-judge/dist/wrap-up-judge.js.map +1 -0
- package/packages/jev-judge/package.json +1 -1
- package/packages/jev-judge/src/environment-judge.ts +271 -0
- package/packages/jev-judge/src/index.ts +9 -1
- package/packages/jev-judge/src/wrap-up-judge.ts +65 -0
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,YAAY,EAGZ,mBAAmB,EAInB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,eAAO,MAAM,QAAQ;aACnB,gBAAgB,EAAE,kBAAkB;aACpC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CA6BrD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ,CAQzE;AAYD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA2B;IAEzC,YAAY,MAAM,EAAE,cAAc,EAWjC;IAED;;;;;;OAMG;IACG,QAAQ,CAAC,CAAC,SAAS,MAAM,EAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CA6FjC;IAED;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;KAAE,CAAC,CAUlE;IAED;;OAEG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,EAAE,GACX,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAU5C;IAED;;OAEG;IACH,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAqC,GAC/C,iBAAiB,CASnB;IAED;;OAEG;IACG,aAAa,CAAC,CAAC,SAAS,MAAM,EAClC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAC3B,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,EAC1B,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACrC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAkBnC;IAOD,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,aAAa;CAStB;AAGD,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,YAAY,EAGZ,mBAAmB,EAInB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,eAAO,MAAM,QAAQ;aACnB,gBAAgB,EAAE,kBAAkB;aACpC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CA6BrD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ,CAQzE;AAYD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA2B;IAEzC,YAAY,MAAM,EAAE,cAAc,EAWjC;IAED;;;;;;OAMG;IACG,QAAQ,CAAC,CAAC,SAAS,MAAM,EAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CA6FjC;IAED;;OAEG;IACG,IAAI,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;KAAE,CAAC,CAUlE;IAED;;OAEG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,EAAE,GACX,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAU5C;IAED;;OAEG;IACH,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAqC,GAC/C,iBAAiB,CASnB;IAED;;OAEG;IACG,aAAa,CAAC,CAAC,SAAS,MAAM,EAClC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAC3B,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,EAC1B,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACrC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAkBnC;IAOD,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,aAAa;CAStB;AAGD,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG9F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -80,7 +80,7 @@ export function hasJevApiKey() {
|
|
|
80
80
|
export function createJevJudge(config) {
|
|
81
81
|
const apiKey = getApiKeyFromEnv();
|
|
82
82
|
if (!apiKey) {
|
|
83
|
-
throw new Error(`Jev API key not found.
|
|
83
|
+
throw new Error(`Jev API key not found. Set TYPESAFE_API_KEY run: echo "{api_key}" > ~/.pi-harness-runtime/keys/jev-api-key.txt`);
|
|
84
84
|
}
|
|
85
85
|
return new JevJudge({ apiKey, ...config });
|
|
86
86
|
}
|
|
@@ -300,4 +300,8 @@ export { E2EJudge } from "./e2e-judge.js";
|
|
|
300
300
|
export { FlakyDetector } from "./flaky-detector.js";
|
|
301
301
|
export { DecisionEngine } from "./decision-engine.js";
|
|
302
302
|
export { AutoContinueJudge, createTaskState } from "./auto-continue.js";
|
|
303
|
+
// Export WrapUpJudge
|
|
304
|
+
export { checkWrapUp, getTodoSummary } from "./wrap-up-judge.js";
|
|
305
|
+
// Export EnvironmentJudge
|
|
306
|
+
export { EnvironmentJudge } from "./environment-judge.js";
|
|
303
307
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAeH,+CAA+C;AAC/C,qDAAqD;AACrD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,kBAAkB,EAAE,oBAAoB;CAChC,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,oCAAoC;IACpC,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,4EAA4E;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,cAAc,CAAC;IAC9E,MAAM,OAAO,GAAG,GAAG,OAAO,2BAA2B,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,OAAO,kBAAkB,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9D,yCAAyC;QACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAC3B,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgC;IAC7D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrap-Up Judge - Block until ALL todos complete
|
|
3
|
+
*
|
|
4
|
+
* Simple rule: ALL tasks must be done before summary.
|
|
5
|
+
* Agent cannot pass incomplete tasks to user.
|
|
6
|
+
*/
|
|
7
|
+
export interface TodoItem {
|
|
8
|
+
id: number;
|
|
9
|
+
subject: string;
|
|
10
|
+
status: "pending" | "in_progress" | "completed";
|
|
11
|
+
}
|
|
12
|
+
export interface WrapUpResult {
|
|
13
|
+
ready: boolean;
|
|
14
|
+
completedCount: number;
|
|
15
|
+
totalCount: number;
|
|
16
|
+
incompleteTasks: TodoItem[];
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if all todos are complete
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkWrapUp(todos: TodoItem[]): WrapUpResult;
|
|
23
|
+
/**
|
|
24
|
+
* Get status summary
|
|
25
|
+
*/
|
|
26
|
+
export declare function getTodoSummary(todos: TodoItem[]): string;
|
|
27
|
+
//# sourceMappingURL=wrap-up-judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-up-judge.d.ts","sourceRoot":"","sources":["../src/wrap-up-judge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,QAAQ,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,YAAY,CAyB3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAUxD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrap-Up Judge - Block until ALL todos complete
|
|
3
|
+
*
|
|
4
|
+
* Simple rule: ALL tasks must be done before summary.
|
|
5
|
+
* Agent cannot pass incomplete tasks to user.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if all todos are complete
|
|
9
|
+
*/
|
|
10
|
+
export function checkWrapUp(todos) {
|
|
11
|
+
const completed = todos.filter((t) => t.status === "completed");
|
|
12
|
+
const incomplete = todos.filter((t) => t.status !== "completed");
|
|
13
|
+
if (incomplete.length === 0) {
|
|
14
|
+
return {
|
|
15
|
+
ready: true,
|
|
16
|
+
completedCount: completed.length,
|
|
17
|
+
totalCount: todos.length,
|
|
18
|
+
incompleteTasks: [],
|
|
19
|
+
message: `[wrap-up] All ${todos.length} tasks completed. Ready for summary.`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const taskList = incomplete
|
|
23
|
+
.map((t) => ` - [${t.id}] ${t.status}: ${t.subject}`)
|
|
24
|
+
.join("\n");
|
|
25
|
+
return {
|
|
26
|
+
ready: false,
|
|
27
|
+
completedCount: completed.length,
|
|
28
|
+
totalCount: todos.length,
|
|
29
|
+
incompleteTasks: incomplete,
|
|
30
|
+
message: `[wrap-up] BLOCKED! ${incomplete.length}/${todos.length} tasks incomplete:\n${taskList}\n\nComplete all tasks before wrap-up.`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get status summary
|
|
35
|
+
*/
|
|
36
|
+
export function getTodoSummary(todos) {
|
|
37
|
+
const completed = todos.filter((t) => t.status === "completed").length;
|
|
38
|
+
const total = todos.length;
|
|
39
|
+
const pct = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
40
|
+
if (completed === total) {
|
|
41
|
+
return `[todos] ${completed}/${total} (${pct}%) - ALL COMPLETE`;
|
|
42
|
+
}
|
|
43
|
+
return `[todos] ${completed}/${total} (${pct}%) - ${total - completed} remaining`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=wrap-up-judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-up-judge.js","sourceRoot":"","sources":["../src/wrap-up-judge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAEjE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,IAAI;YACX,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE,iBAAiB,KAAK,CAAC,MAAM,sCAAsC;SAC7E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,SAAS,CAAC,MAAM;QAChC,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,eAAe,EAAE,UAAU;QAC3B,OAAO,EAAE,sBAAsB,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,uBAAuB,QAAQ,wCAAwC;KACxI,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,WAAW,SAAS,IAAI,KAAK,KAAK,GAAG,mBAAmB,CAAC;IAClE,CAAC;IAED,OAAO,WAAW,SAAS,IAAI,KAAK,KAAK,GAAG,QAAQ,KAAK,GAAG,SAAS,YAAY,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,271 @@
|
|
|
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
|
+
import { JevJudge, getApiKeyFromEnv } from "./index.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Environment context
|
|
15
|
+
*/
|
|
16
|
+
export interface EnvironmentContext {
|
|
17
|
+
hostname?: string;
|
|
18
|
+
currentPath?: string;
|
|
19
|
+
isRemoteSession?: boolean;
|
|
20
|
+
hasSSHConnection?: boolean;
|
|
21
|
+
gitRemote?: string;
|
|
22
|
+
isProduction?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Environment decision result
|
|
27
|
+
*/
|
|
28
|
+
export interface EnvironmentDecision {
|
|
29
|
+
isLocal: boolean;
|
|
30
|
+
isRemote: boolean;
|
|
31
|
+
likelyServer?: "dev" | "prod" | "unknown";
|
|
32
|
+
confidence: "high" | "medium" | "low";
|
|
33
|
+
reasoning: string;
|
|
34
|
+
warnings: string[];
|
|
35
|
+
recommendedActions: string[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Build/restart safety check
|
|
40
|
+
*/
|
|
41
|
+
export interface SafetyCheck {
|
|
42
|
+
safe: boolean;
|
|
43
|
+
isLocal: boolean;
|
|
44
|
+
targetServer?: "dev" | "prod" | "unknown";
|
|
45
|
+
warnings: string[];
|
|
46
|
+
requiresConfirmation: boolean;
|
|
47
|
+
recommendedCommand?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Environment Judge configuration
|
|
52
|
+
*/
|
|
53
|
+
export interface EnvironmentConfig {
|
|
54
|
+
devPatterns?: string[];
|
|
55
|
+
prodPatterns?: string[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const DEFAULT_CONFIG = {
|
|
59
|
+
devPatterns: ["dev", "staging", "test", "local"],
|
|
60
|
+
prodPatterns: ["prod", "production", "live", "主站"],
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export class EnvironmentJudge {
|
|
64
|
+
private jev?: JevJudge;
|
|
65
|
+
private config: Required<EnvironmentConfig>;
|
|
66
|
+
|
|
67
|
+
constructor(config: EnvironmentConfig = {}) {
|
|
68
|
+
this.config = {
|
|
69
|
+
devPatterns: config.devPatterns ?? DEFAULT_CONFIG.devPatterns,
|
|
70
|
+
prodPatterns: config.prodPatterns ?? DEFAULT_CONFIG.prodPatterns,
|
|
71
|
+
} as Required<EnvironmentConfig>;
|
|
72
|
+
|
|
73
|
+
const apiKey = getApiKeyFromEnv();
|
|
74
|
+
if (apiKey) {
|
|
75
|
+
try {
|
|
76
|
+
this.jev = new JevJudge({ apiKey });
|
|
77
|
+
} catch {
|
|
78
|
+
// Jev not available
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async analyze(context?: EnvironmentContext): Promise<EnvironmentDecision> {
|
|
84
|
+
const ctx = context ?? (await this.detectEnvironment());
|
|
85
|
+
return this.makeDecision(ctx);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async checkBuildSafety(context?: EnvironmentContext): Promise<SafetyCheck> {
|
|
89
|
+
const env = await this.analyze(context);
|
|
90
|
+
const warnings: string[] = [];
|
|
91
|
+
|
|
92
|
+
if (!env.isLocal) {
|
|
93
|
+
warnings.push(`Running on remote server (${env.likelyServer ?? "unknown"})`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (env.likelyServer === "prod") {
|
|
97
|
+
warnings.push("⚠️ WARNING: This appears to be a PRODUCTION server!");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
safe: env.likelyServer !== "prod",
|
|
102
|
+
isLocal: env.isLocal,
|
|
103
|
+
targetServer: env.likelyServer,
|
|
104
|
+
warnings,
|
|
105
|
+
requiresConfirmation: env.likelyServer === "prod",
|
|
106
|
+
recommendedCommand: env.isLocal ? "build locally" : `ssh to target server first, then build`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async checkSSHCommand(host: string, command: string): Promise<SafetyCheck> {
|
|
111
|
+
const env = await this.analyze();
|
|
112
|
+
const isLocalHost = this.isLocalHost(host);
|
|
113
|
+
|
|
114
|
+
if (isLocalHost && env.isLocal) {
|
|
115
|
+
return {
|
|
116
|
+
safe: true,
|
|
117
|
+
isLocal: true,
|
|
118
|
+
targetServer: env.likelyServer,
|
|
119
|
+
warnings: [],
|
|
120
|
+
requiresConfirmation: false,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (isLocalHost && !env.isLocal) {
|
|
125
|
+
return {
|
|
126
|
+
safe: false,
|
|
127
|
+
isLocal: false,
|
|
128
|
+
targetServer: env.likelyServer,
|
|
129
|
+
warnings: [
|
|
130
|
+
`⚠️ You're already on this server via SSH!`,
|
|
131
|
+
`Running '${command}' directly would be more efficient.`,
|
|
132
|
+
],
|
|
133
|
+
requiresConfirmation: true,
|
|
134
|
+
recommendedCommand: command,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
safe: true,
|
|
140
|
+
isLocal: false,
|
|
141
|
+
targetServer: this.guessServer(host),
|
|
142
|
+
warnings: [],
|
|
143
|
+
requiresConfirmation: false,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private async detectEnvironment(): Promise<EnvironmentContext> {
|
|
148
|
+
const os = await import("os");
|
|
149
|
+
|
|
150
|
+
const hostname = os.hostname();
|
|
151
|
+
const cwd = process.cwd();
|
|
152
|
+
const sshConnection = process.env.SSH_CONNECTION || process.env.SSH_CLIENT;
|
|
153
|
+
const hasSSHConnection = !!(sshConnection);
|
|
154
|
+
|
|
155
|
+
let gitRemote = "";
|
|
156
|
+
try {
|
|
157
|
+
const { execSync } = await import("child_process");
|
|
158
|
+
gitRemote = execSync("git remote get-url origin 2>/dev/null || echo ''", { encoding: "utf8" }).trim();
|
|
159
|
+
} catch {
|
|
160
|
+
// Ignore
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
hostname,
|
|
165
|
+
currentPath: cwd,
|
|
166
|
+
isRemoteSession: hasSSHConnection,
|
|
167
|
+
hasSSHConnection,
|
|
168
|
+
gitRemote,
|
|
169
|
+
isProduction: this.detectProduction(hostname),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private detectProduction(hostname: string): boolean {
|
|
174
|
+
const lower = hostname.toLowerCase();
|
|
175
|
+
return (
|
|
176
|
+
this.config.prodPatterns.some((p) => lower.includes(p)) ||
|
|
177
|
+
/^(prod|production|live|主站)/.test(hostname)
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private isLocalHost(host: string): boolean {
|
|
182
|
+
const hostname = process.env.HOSTNAME || "unknown";
|
|
183
|
+
const localhosts = ["localhost", "127.0.0.1", "0.0.0.0", hostname];
|
|
184
|
+
return localhosts.some((l) => host.includes(l));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private guessServer(host: string): "dev" | "prod" | "unknown" {
|
|
188
|
+
const lower = host.toLowerCase();
|
|
189
|
+
if (this.config.prodPatterns.some((p) => lower.includes(p))) return "prod";
|
|
190
|
+
if (this.config.devPatterns.some((p) => lower.includes(p))) return "dev";
|
|
191
|
+
return "unknown";
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private async makeDecision(ctx: EnvironmentContext): Promise<EnvironmentDecision> {
|
|
195
|
+
if (!this.jev) {
|
|
196
|
+
return this.fallbackDecision(ctx);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
try {
|
|
200
|
+
const result = await this.jev.evaluate(ctx, {
|
|
201
|
+
isLocal: {
|
|
202
|
+
type: "noul",
|
|
203
|
+
instructions: "Is the agent running on a local machine or a remote server?",
|
|
204
|
+
},
|
|
205
|
+
serverType: {
|
|
206
|
+
type: "choice",
|
|
207
|
+
instructions: "What type of server is this?",
|
|
208
|
+
options: ["dev", "prod", "unknown"],
|
|
209
|
+
},
|
|
210
|
+
safeToBuild: {
|
|
211
|
+
type: "noul",
|
|
212
|
+
instructions: "Is it safe to run build/restart commands on this environment?",
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
const isLocalScore = (result.decisions.isLocal?.response as { noul: number })?.noul ?? 0.5;
|
|
217
|
+
const serverType = (result.decisions.serverType as { response: { choice: string } })?.response?.choice ?? "unknown";
|
|
218
|
+
const safeToBuild = (result.decisions.safeToBuild?.response as { noul: number })?.noul ?? 0.5 > 0.5;
|
|
219
|
+
|
|
220
|
+
const warnings: string[] = [];
|
|
221
|
+
const recommendedActions: string[] = [];
|
|
222
|
+
|
|
223
|
+
if (serverType === "prod" && !safeToBuild) {
|
|
224
|
+
warnings.push("⚠️ Production server - confirm before destructive actions");
|
|
225
|
+
recommendedActions.push("Request explicit user confirmation");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
isLocal: isLocalScore > 0.5,
|
|
230
|
+
isRemote: isLocalScore <= 0.5,
|
|
231
|
+
likelyServer: serverType as "dev" | "prod" | "unknown",
|
|
232
|
+
confidence: "medium",
|
|
233
|
+
reasoning: "Jev analysis complete",
|
|
234
|
+
warnings,
|
|
235
|
+
recommendedActions,
|
|
236
|
+
};
|
|
237
|
+
} catch (error) {
|
|
238
|
+
console.error("[EnvironmentJudge] Jev call failed:", error);
|
|
239
|
+
return this.fallbackDecision(ctx);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
private fallbackDecision(ctx: EnvironmentContext): EnvironmentDecision {
|
|
244
|
+
const hostname = ctx.hostname ?? "unknown";
|
|
245
|
+
const isProduction = this.detectProduction(hostname);
|
|
246
|
+
const isLocal = !ctx.isRemoteSession && !ctx.hasSSHConnection;
|
|
247
|
+
|
|
248
|
+
const warnings: string[] = [];
|
|
249
|
+
const recommendedActions: string[] = [];
|
|
250
|
+
|
|
251
|
+
if (isProduction) {
|
|
252
|
+
warnings.push("⚠️ This appears to be a PRODUCTION server!");
|
|
253
|
+
recommendedActions.push("Confirm with user before build/restart");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (!isLocal) {
|
|
257
|
+
warnings.push(`Running on remote server: ${hostname}`);
|
|
258
|
+
recommendedActions.push("Verify target server before SSH commands");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
isLocal,
|
|
263
|
+
isRemote: !isLocal,
|
|
264
|
+
likelyServer: isProduction ? "prod" : "dev",
|
|
265
|
+
confidence: isProduction ? "high" : "medium",
|
|
266
|
+
reasoning: `Fallback: hostname=${hostname}, remote=${!isLocal}`,
|
|
267
|
+
warnings,
|
|
268
|
+
recommendedActions,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
@@ -101,7 +101,7 @@ export function createJevJudge(config?: Partial<JevJudgeConfig>): JevJudge {
|
|
|
101
101
|
const apiKey = getApiKeyFromEnv();
|
|
102
102
|
if (!apiKey) {
|
|
103
103
|
throw new Error(
|
|
104
|
-
`Jev API key not found.
|
|
104
|
+
`Jev API key not found. Set TYPESAFE_API_KEY run: echo "{api_key}" > ~/.pi-harness-runtime/keys/jev-api-key.txt`
|
|
105
105
|
);
|
|
106
106
|
}
|
|
107
107
|
return new JevJudge({ apiKey, ...config });
|
|
@@ -382,3 +382,11 @@ export { FlakyDetector } from "./flaky-detector.js";
|
|
|
382
382
|
export { DecisionEngine } from "./decision-engine.js";
|
|
383
383
|
export { AutoContinueJudge, createTaskState } from "./auto-continue.js";
|
|
384
384
|
export type { TaskState, AutoContinueDecision, AutoContinueConfig } from "./auto-continue.js";
|
|
385
|
+
|
|
386
|
+
// Export WrapUpJudge
|
|
387
|
+
export { checkWrapUp, getTodoSummary } from "./wrap-up-judge.js";
|
|
388
|
+
export type { TodoItem, WrapUpResult } from "./wrap-up-judge.js";
|
|
389
|
+
|
|
390
|
+
// Export EnvironmentJudge
|
|
391
|
+
export { EnvironmentJudge } from "./environment-judge.js";
|
|
392
|
+
export type { EnvironmentContext, EnvironmentDecision, SafetyCheck, EnvironmentConfig } from "./environment-judge.js";
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrap-Up Judge - Block until ALL todos complete
|
|
3
|
+
*
|
|
4
|
+
* Simple rule: ALL tasks must be done before summary.
|
|
5
|
+
* Agent cannot pass incomplete tasks to user.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface TodoItem {
|
|
9
|
+
id: number;
|
|
10
|
+
subject: string;
|
|
11
|
+
status: "pending" | "in_progress" | "completed";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface WrapUpResult {
|
|
15
|
+
ready: boolean;
|
|
16
|
+
completedCount: number;
|
|
17
|
+
totalCount: number;
|
|
18
|
+
incompleteTasks: TodoItem[];
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Check if all todos are complete
|
|
24
|
+
*/
|
|
25
|
+
export function checkWrapUp(todos: TodoItem[]): WrapUpResult {
|
|
26
|
+
const completed = todos.filter((t) => t.status === "completed");
|
|
27
|
+
const incomplete = todos.filter((t) => t.status !== "completed");
|
|
28
|
+
|
|
29
|
+
if (incomplete.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
ready: true,
|
|
32
|
+
completedCount: completed.length,
|
|
33
|
+
totalCount: todos.length,
|
|
34
|
+
incompleteTasks: [],
|
|
35
|
+
message: `[wrap-up] All ${todos.length} tasks completed. Ready for summary.`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const taskList = incomplete
|
|
40
|
+
.map((t) => ` - [${t.id}] ${t.status}: ${t.subject}`)
|
|
41
|
+
.join("\n");
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
ready: false,
|
|
45
|
+
completedCount: completed.length,
|
|
46
|
+
totalCount: todos.length,
|
|
47
|
+
incompleteTasks: incomplete,
|
|
48
|
+
message: `[wrap-up] BLOCKED! ${incomplete.length}/${todos.length} tasks incomplete:\n${taskList}\n\nComplete all tasks before wrap-up.`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Get status summary
|
|
54
|
+
*/
|
|
55
|
+
export function getTodoSummary(todos: TodoItem[]): string {
|
|
56
|
+
const completed = todos.filter((t) => t.status === "completed").length;
|
|
57
|
+
const total = todos.length;
|
|
58
|
+
const pct = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
59
|
+
|
|
60
|
+
if (completed === total) {
|
|
61
|
+
return `[todos] ${completed}/${total} (${pct}%) - ALL COMPLETE`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return `[todos] ${completed}/${total} (${pct}%) - ${total - completed} remaining`;
|
|
65
|
+
}
|