pi-harness-runtime 1.1.394 → 1.1.396
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/AGENTS.md +135 -4
- package/harness/glm-quota-logger.ts +17 -0
- package/harness/langchain/planner-logger.ts +15 -0
- package/harness/service-diagnostics.ts +32 -1
- package/index.ts +92 -3
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/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/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/connection-runtime/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/contracts/dist/workspace-env-format.d.ts +87 -0
- package/packages/contracts/dist/workspace-env-format.js +174 -6
- package/packages/contracts/dist/workspace-env.js +120 -9
- package/packages/contracts/package.json +1 -1
- package/packages/contracts/src/workspace-env-format.ts +209 -6
- package/packages/contracts/src/workspace-env.ts +128 -7
- package/packages/contracts/test/workspace-env.test.ts +177 -0
- 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/durable-review/package.json +1 -1
- package/packages/e2e-tester/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-sink/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/continuation-controller.d.ts +47 -0
- package/packages/jev-judge/dist/continuation-controller.d.ts.map +1 -1
- package/packages/jev-judge/dist/continuation-controller.js +142 -16
- package/packages/jev-judge/dist/continuation-controller.js.map +1 -1
- package/packages/jev-judge/dist/index.d.ts +6 -0
- package/packages/jev-judge/dist/index.d.ts.map +1 -1
- package/packages/jev-judge/dist/index.js +6 -0
- package/packages/jev-judge/dist/index.js.map +1 -1
- package/packages/jev-judge/dist/validation-ledger.d.ts +129 -0
- package/packages/jev-judge/dist/validation-ledger.d.ts.map +1 -0
- package/packages/jev-judge/dist/validation-ledger.js +234 -0
- package/packages/jev-judge/dist/validation-ledger.js.map +1 -0
- package/packages/jev-judge/dist/validation-plan.d.ts +176 -0
- package/packages/jev-judge/dist/validation-plan.d.ts.map +1 -0
- package/packages/jev-judge/dist/validation-plan.js +293 -0
- package/packages/jev-judge/dist/validation-plan.js.map +1 -0
- package/packages/jev-judge/dist/validation-tie-breaker.d.ts +48 -0
- package/packages/jev-judge/dist/validation-tie-breaker.d.ts.map +1 -0
- package/packages/jev-judge/dist/validation-tie-breaker.js +83 -0
- package/packages/jev-judge/dist/validation-tie-breaker.js.map +1 -0
- package/packages/jev-judge/package.json +1 -1
- package/packages/jev-judge/src/continuation-controller.ts +179 -20
- package/packages/jev-judge/src/index.ts +41 -0
- package/packages/jev-judge/src/validation-ledger.ts +290 -0
- package/packages/jev-judge/src/validation-plan.ts +406 -0
- package/packages/jev-judge/src/validation-tie-breaker.ts +123 -0
- package/packages/jev-judge/tests/continuation-controller.test.ts +167 -0
- package/packages/jev-judge/tests/validation-ledger.test.ts +181 -0
- package/packages/jev-judge/tests/validation-plan.test.ts +170 -0
- package/packages/jev-judge/tests/validation-tie-breaker.test.ts +88 -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/logging/README.md +37 -0
- package/packages/logging/dist/buffer.d.ts +33 -0
- package/packages/logging/dist/buffer.d.ts.map +1 -0
- package/packages/logging/dist/buffer.js +60 -0
- package/packages/logging/dist/buffer.js.map +1 -0
- package/packages/logging/dist/config.d.ts +40 -0
- package/packages/logging/dist/config.d.ts.map +1 -0
- package/packages/logging/dist/config.js +114 -0
- package/packages/logging/dist/config.js.map +1 -0
- package/packages/logging/dist/index.d.ts +32 -0
- package/packages/logging/dist/index.d.ts.map +1 -0
- package/packages/logging/dist/index.js +31 -0
- package/packages/logging/dist/index.js.map +1 -0
- package/packages/logging/dist/redact.d.ts +43 -0
- package/packages/logging/dist/redact.d.ts.map +1 -0
- package/packages/logging/dist/redact.js +220 -0
- package/packages/logging/dist/redact.js.map +1 -0
- package/packages/logging/dist/sampler.d.ts +37 -0
- package/packages/logging/dist/sampler.d.ts.map +1 -0
- package/packages/logging/dist/sampler.js +78 -0
- package/packages/logging/dist/sampler.js.map +1 -0
- package/packages/logging/dist/shipper.d.ts +82 -0
- package/packages/logging/dist/shipper.d.ts.map +1 -0
- package/packages/logging/dist/shipper.js +238 -0
- package/packages/logging/dist/shipper.js.map +1 -0
- package/packages/logging/dist/singleton.d.ts +38 -0
- package/packages/logging/dist/singleton.d.ts.map +1 -0
- package/packages/logging/dist/singleton.js +95 -0
- package/packages/logging/dist/singleton.js.map +1 -0
- package/packages/logging/dist/spool.d.ts +39 -0
- package/packages/logging/dist/spool.d.ts.map +1 -0
- package/packages/logging/dist/spool.js +110 -0
- package/packages/logging/dist/spool.js.map +1 -0
- package/packages/logging/dist/transports/r2.d.ts +31 -0
- package/packages/logging/dist/transports/r2.d.ts.map +1 -0
- package/packages/logging/dist/transports/r2.js +60 -0
- package/packages/logging/dist/transports/r2.js.map +1 -0
- package/packages/logging/dist/transports/webhook.d.ts +22 -0
- package/packages/logging/dist/transports/webhook.d.ts.map +1 -0
- package/packages/logging/dist/transports/webhook.js +37 -0
- package/packages/logging/dist/transports/webhook.js.map +1 -0
- package/packages/logging/dist/types.d.ts +73 -0
- package/packages/logging/dist/types.d.ts.map +1 -0
- package/packages/logging/dist/types.js +19 -0
- package/packages/logging/dist/types.js.map +1 -0
- package/packages/logging/package.json +37 -0
- package/packages/logging/src/buffer.ts +77 -0
- package/packages/logging/src/config.ts +163 -0
- package/packages/logging/src/index.ts +87 -0
- package/packages/logging/src/redact.ts +271 -0
- package/packages/logging/src/sampler.ts +97 -0
- package/packages/logging/src/shipper.ts +281 -0
- package/packages/logging/src/singleton.ts +142 -0
- package/packages/logging/src/spool.ts +139 -0
- package/packages/logging/src/transports/r2.ts +86 -0
- package/packages/logging/src/transports/webhook.ts +54 -0
- package/packages/logging/src/types.ts +85 -0
- package/packages/logging/test/buffer.test.ts +44 -0
- package/packages/logging/test/config.test.ts +97 -0
- package/packages/logging/test/integration.test.ts +135 -0
- package/packages/logging/test/redact.test.ts +109 -0
- package/packages/logging/test/sampler.test.ts +57 -0
- package/packages/logging/test/shipper.test.ts +152 -0
- package/packages/logging/test/spool.test.ts +93 -0
- 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/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/permission-mode/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/qdrant-skills/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/relay/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/skills/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/telegram/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/voice-api/package.json +1 -1
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/wiki/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
- package/scripts/unified-webhook-server.ts +102 -0
- package/scripts/validation-run.ts +191 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/provider-router",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.396",
|
|
4
4
|
"description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/provider-router.js",
|
|
@@ -29,6 +29,10 @@ import type { RelayServerOptions } from "../packages/relay/src/server";
|
|
|
29
29
|
// One implementation of the Telegram allow-list (env var, key file, legacy
|
|
30
30
|
// chat id) - the harness and this server must agree on who may write in.
|
|
31
31
|
import { getAllowedUserIds, isAuthorizedTelegramSender } from "../harness/telegram-auth";
|
|
32
|
+
// Centralized application logs: the harness ships redacted batches to
|
|
33
|
+
// /api/logs, the server persists them and relays them to Cloudflare R2.
|
|
34
|
+
import { redactValue } from "../packages/logging/src/redact";
|
|
35
|
+
import { loadR2Config, R2Client } from "./r2-storage";
|
|
32
36
|
|
|
33
37
|
// --- Configuration ---
|
|
34
38
|
interface Config {
|
|
@@ -72,6 +76,11 @@ const JOB_COMMANDS_FILE = join(process.env.HOME || homedir() || "/tmp", ".pi-har
|
|
|
72
76
|
// --- Callback Queue (fallback when no relay client is connected) ---
|
|
73
77
|
const CALLBACK_QUEUE_FILE = join(process.env.HOME || homedir() || "/tmp", ".pi-harness-runtime", "callback-queue.jsonl");
|
|
74
78
|
|
|
79
|
+
// --- Log ingest (centralized application logs) ---
|
|
80
|
+
const LOG_INGEST_DIR = join(process.env.HOME || homedir() || "/tmp", ".pi-harness-runtime", "logs", "inbound");
|
|
81
|
+
/** Largest accepted ingest body (2 MB). A batch is NDJSON, so this is generous. */
|
|
82
|
+
const LOG_INGEST_MAX_BYTES = 2 * 1024 * 1024;
|
|
83
|
+
|
|
75
84
|
/**
|
|
76
85
|
* Persist a callback to disk when no WebSocket client is connected.
|
|
77
86
|
* Without this, a click that lands while the relay client is offline is lost.
|
|
@@ -86,6 +95,96 @@ function queueCallback(payload: CallbackPayload): void {
|
|
|
86
95
|
}
|
|
87
96
|
}
|
|
88
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Persist an inbound log batch and relay it to Cloudflare R2.
|
|
100
|
+
*
|
|
101
|
+
* The harness already redacts what it sends; the server re-redacts it
|
|
102
|
+
* (defence in depth) and writes NDJSON next to the other harness logs. The
|
|
103
|
+
* R2 relay is best effort: a failed upload never fails the request, because
|
|
104
|
+
* the batch is already on disk.
|
|
105
|
+
*/
|
|
106
|
+
async function handleLogIngest(req: IncomingMessage, res: ServerResponse): Promise<void> {
|
|
107
|
+
const ingestToken = process.env.LOG_INGEST_TOKEN;
|
|
108
|
+
if (ingestToken) {
|
|
109
|
+
const auth = req.headers.authorization;
|
|
110
|
+
if (auth !== `Bearer ${ingestToken}`) {
|
|
111
|
+
res.writeHead(403, { "Content-Type": "application/json" });
|
|
112
|
+
res.end(JSON.stringify({ error: "forbidden" }));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const chunks: Buffer[] = [];
|
|
118
|
+
let size = 0;
|
|
119
|
+
for await (const chunk of req) {
|
|
120
|
+
size += (chunk as Buffer).length;
|
|
121
|
+
if (size > LOG_INGEST_MAX_BYTES) {
|
|
122
|
+
res.writeHead(413, { "Content-Type": "application/json" });
|
|
123
|
+
res.end(JSON.stringify({ error: "payload too large" }));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
chunks.push(chunk as Buffer);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let payload: { batchId?: string; records?: unknown[] };
|
|
130
|
+
try {
|
|
131
|
+
payload = JSON.parse(Buffer.concat(chunks).toString());
|
|
132
|
+
} catch {
|
|
133
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
134
|
+
res.end(JSON.stringify({ error: "invalid json" }));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const incoming = Array.isArray(payload.records) ? payload.records : [];
|
|
139
|
+
const records = incoming.map((record) => sanitizeLogRecord(record));
|
|
140
|
+
|
|
141
|
+
// Persist locally first - the R2 relay is best effort.
|
|
142
|
+
try {
|
|
143
|
+
if (!existsSync(LOG_INGEST_DIR)) mkdirSync(LOG_INGEST_DIR, { recursive: true });
|
|
144
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
145
|
+
const file = join(LOG_INGEST_DIR, `logs-${day}.ndjson`);
|
|
146
|
+
appendFileSync(file, records.map((record) => JSON.stringify(record)).join("\n") + "\n");
|
|
147
|
+
} catch (err) {
|
|
148
|
+
console.error("[LogIngest] Failed to persist batch:", err);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let relayed = false;
|
|
152
|
+
try {
|
|
153
|
+
const r2Config = loadR2Config();
|
|
154
|
+
if (r2Config) {
|
|
155
|
+
const client = new R2Client(r2Config);
|
|
156
|
+
const now = new Date();
|
|
157
|
+
const stamp = `${now.getUTCFullYear()}/${String(now.getUTCMonth() + 1).padStart(2, "0")}/${String(now.getUTCDate()).padStart(2, "0")}`;
|
|
158
|
+
await client.upload({
|
|
159
|
+
key: `logs/inbound/${stamp}/${payload.batchId ?? Date.now()}.ndjson`,
|
|
160
|
+
body: records.map((record) => JSON.stringify(record)).join("\n") + "\n",
|
|
161
|
+
contentType: "application/x-ndjson",
|
|
162
|
+
});
|
|
163
|
+
relayed = true;
|
|
164
|
+
}
|
|
165
|
+
} catch (err) {
|
|
166
|
+
console.error("[LogIngest] Failed to relay batch to R2:", err);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
res.writeHead(202, { "Content-Type": "application/json" });
|
|
170
|
+
res.end(JSON.stringify({ accepted: records.length, relayed }));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Re-redact one inbound record. Unknown shapes are kept as a redacted value. */
|
|
174
|
+
function sanitizeLogRecord(record: unknown): Record<string, unknown> {
|
|
175
|
+
if (!record || typeof record !== "object") {
|
|
176
|
+
return { value: redactValue(record) };
|
|
177
|
+
}
|
|
178
|
+
const safe: Record<string, unknown> = { ...(record as Record<string, unknown>) };
|
|
179
|
+
if (typeof safe.message === "string") {
|
|
180
|
+
safe.message = redactValue(safe.message);
|
|
181
|
+
}
|
|
182
|
+
if (safe.fields && typeof safe.fields === "object") {
|
|
183
|
+
safe.fields = redactValue(safe.fields);
|
|
184
|
+
}
|
|
185
|
+
return safe;
|
|
186
|
+
}
|
|
187
|
+
|
|
89
188
|
interface JobCommand {
|
|
90
189
|
command: string;
|
|
91
190
|
jobId: string;
|
|
@@ -550,6 +649,9 @@ async function main() {
|
|
|
550
649
|
acknowledgeCommands();
|
|
551
650
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
552
651
|
res.end(JSON.stringify({ success: true }));
|
|
652
|
+
} else if (url.pathname === "/api/logs" && req.method === "POST") {
|
|
653
|
+
// Centralized application logs from the harness
|
|
654
|
+
await handleLogIngest(req, res);
|
|
553
655
|
} else if (url.pathname === "/health") {
|
|
554
656
|
// Keep the plain-text contract that external monitors check for "OK".
|
|
555
657
|
res.writeHead(200, { "Content-Type": "text/plain" });
|