pi-harness-runtime 1.1.225 → 1.1.227
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/harness-startup-status.ts +27 -0
- package/index.ts +66 -97
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/dist/extension.d.ts.map +1 -1
- package/packages/agent-policy/dist/extension.js +8 -7
- package/packages/agent-policy/dist/extension.js.map +1 -1
- package/packages/agent-policy/dist/file-logger.d.ts +9 -0
- package/packages/agent-policy/dist/file-logger.d.ts.map +1 -0
- package/packages/agent-policy/dist/file-logger.js +27 -0
- package/packages/agent-policy/dist/file-logger.js.map +1 -0
- package/packages/agent-policy/dist/policy-loader.d.ts.map +1 -1
- package/packages/agent-policy/dist/policy-loader.js +5 -4
- package/packages/agent-policy/dist/policy-loader.js.map +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/agent-policy/src/extension.ts +8 -7
- package/packages/agent-policy/src/file-logger.ts +31 -0
- package/packages/agent-policy/src/policy-loader.ts +5 -4
- 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/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/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-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/package.json +1 -1
- 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/paperclip-integration/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/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/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/webmcp-tester/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
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type HarnessStatus = "wait" | "ok" | "warn" | "err";
|
|
2
|
+
|
|
3
|
+
export interface HarnessMessage {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
text: string;
|
|
7
|
+
status: HarnessStatus;
|
|
8
|
+
details?: string[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** One store for initialization before, during, and after the widget mounts. */
|
|
12
|
+
export class HarnessStartupStatus {
|
|
13
|
+
readonly messages: HarnessMessage[] = [];
|
|
14
|
+
onChange?: () => void;
|
|
15
|
+
|
|
16
|
+
update(label: string, text: string, status: HarnessStatus = "wait", details?: string[]): void {
|
|
17
|
+
const next = { id: label, label, text, status, details };
|
|
18
|
+
const existing = this.messages.findIndex((message) => message.id === label);
|
|
19
|
+
if (existing === -1) this.messages.push(next);
|
|
20
|
+
else this.messages[existing] = next;
|
|
21
|
+
this.onChange?.();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function harnessStatusMarker(status: HarnessStatus): string {
|
|
26
|
+
return { wait: "[WAIT]", ok: "[OK]", warn: "[WARN]", err: "[ERR]" }[status];
|
|
27
|
+
}
|
package/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
ExtensionCommandContext,
|
|
20
20
|
ExtensionContext,
|
|
21
21
|
} from "@earendil-works/pi-coding-agent";
|
|
22
|
+
import { HarnessStartupStatus, harnessStatusMarker } from "./harness-startup-status.ts";
|
|
22
23
|
import { UsageTracker } from "./tracker.ts";
|
|
23
24
|
import { MirrorStore, type MirrorRecord } from "./mirror.ts";
|
|
24
25
|
import { MiniMaxQuotaScraper } from "./harness/e2e/minimax-quota-scraper.js";
|
|
@@ -122,30 +123,12 @@ async function getTaskContext(): Promise<{
|
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
// --- Harness Startup Widget Messages (used by init functions) -----------------
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
text: string;
|
|
129
|
-
status: "wait" | "ok" | "err";
|
|
130
|
-
details?: string[]; // Multi-line fix instructions for errors
|
|
131
|
-
}
|
|
132
|
-
const harnessMessages: HarnessMessage[] = [];
|
|
133
|
-
const preSessionErrors: HarnessMessage[] = []; // Errors from init functions (before session_start)
|
|
134
|
-
|
|
135
|
-
function addHarnessMessage(label: string, text: string, status: "wait" | "ok" | "err" = "wait", details?: string[]) {
|
|
136
|
-
const id = `${label}-${Date.now()}`;
|
|
137
|
-
const msg: HarnessMessage = { id, label, text, status, details };
|
|
138
|
-
|
|
139
|
-
// If session hasn't started yet, store in preSessionErrors
|
|
140
|
-
// The session_start handler will merge these into harnessMessages
|
|
141
|
-
if (harnessMessages.length === 0) {
|
|
142
|
-
preSessionErrors.push(msg);
|
|
143
|
-
} else {
|
|
144
|
-
harnessMessages.push(msg);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
126
|
+
const startupStatus = new HarnessStartupStatus();
|
|
127
|
+
const harnessMessages = startupStatus.messages;
|
|
128
|
+
const addHarnessMessage = startupStatus.update.bind(startupStatus);
|
|
147
129
|
|
|
148
130
|
async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
131
|
+
addHarnessMessage("Jev", "initializing", "wait");
|
|
149
132
|
try {
|
|
150
133
|
// Check if Jev API key is available (env var or keys file)
|
|
151
134
|
const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
|
|
@@ -158,19 +141,21 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
158
141
|
}
|
|
159
142
|
|
|
160
143
|
const hasEnvKey =
|
|
161
|
-
process.env.TYPESAFE_API_KEY || process.env.OPENROUTER_API_KEY;
|
|
144
|
+
process.env.TYPESAFE_API_KEY?.trim() || process.env.OPENROUTER_API_KEY?.trim();
|
|
162
145
|
const hasFileKey =
|
|
163
146
|
existsSync(`${keysDir}/jev-api-key.txt`) &&
|
|
164
|
-
readFileSync(`${keysDir}/jev-api-key.txt`, "utf8").trim().length >
|
|
147
|
+
readFileSync(`${keysDir}/jev-api-key.txt`, "utf8").trim().length > 0;
|
|
165
148
|
|
|
166
149
|
if (!hasEnvKey && !hasFileKey) {
|
|
150
|
+
addHarnessMessage("Jev", "API key missing or empty; auto-continue unavailable", "warn", [
|
|
151
|
+
"Set TYPESAFE_API_KEY or ~/.pi-harness-runtime/keys/jev-api-key.txt, then reload Pi.",
|
|
152
|
+
]);
|
|
167
153
|
logToFile("[auto-continue]", "No Jev API key found. Set TYPESAFE_API_KEY run: echo \"{api_key}\" > ~/.pi-harness-runtime/keys/jev-api-key.txt");
|
|
168
154
|
return;
|
|
169
155
|
}
|
|
170
156
|
|
|
171
157
|
// Resolve the actual API key: env takes priority, file is fallback
|
|
172
|
-
const resolvedApiKey =
|
|
173
|
-
process.env.OPENROUTER_API_KEY ||
|
|
158
|
+
const resolvedApiKey = hasEnvKey ||
|
|
174
159
|
readFileSync(`${keysDir}/jev-api-key.txt`, "utf8").trim();
|
|
175
160
|
|
|
176
161
|
const mod = await import("./packages/jev-judge/src/auto-continue.js");
|
|
@@ -450,13 +435,17 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
450
435
|
} catch {
|
|
451
436
|
_inferenceInProgress = false;
|
|
452
437
|
updateAutoContinueStatus("ERROR");
|
|
438
|
+
addHarnessMessage("Jev", "auto-continue evaluation failed", "err");
|
|
453
439
|
}
|
|
454
440
|
};
|
|
455
441
|
|
|
456
442
|
// Start periodic check
|
|
457
443
|
autoContinueTimer = setInterval(checkAndAutoContinue, AUTO_CONTINUE_INTERVAL_MS);
|
|
444
|
+
addHarnessMessage("Jev", "auto-continue configured (API not yet verified)", "ok");
|
|
458
445
|
} catch {
|
|
459
|
-
|
|
446
|
+
addHarnessMessage("Jev", "auto-continue initialization failed", "err", [
|
|
447
|
+
"Check Jev package installation and key-file permissions, then reload Pi.",
|
|
448
|
+
]);
|
|
460
449
|
}
|
|
461
450
|
}
|
|
462
451
|
|
|
@@ -485,6 +474,7 @@ async function initConfigCapture(pi: ExtensionAPI): Promise<void> {
|
|
|
485
474
|
// --- qdrant-vector-search: Semantic skill search via Qdrant -------------------
|
|
486
475
|
// Check config and report status — right after Jev for discoverability
|
|
487
476
|
async function initQdrant(): Promise<void> {
|
|
477
|
+
addHarnessMessage("Qdrant", "checking configuration", "wait");
|
|
488
478
|
try {
|
|
489
479
|
const { getQdrantConfig } = await import("./packages/skills/src/loader.js");
|
|
490
480
|
const cfg = getQdrantConfig();
|
|
@@ -494,23 +484,27 @@ async function initQdrant(): Promise<void> {
|
|
|
494
484
|
const embeddingKey = getOpenAIApiKey();
|
|
495
485
|
if (embeddingKey) {
|
|
496
486
|
logStartup("[pi-harness] Qdrant vector search ready");
|
|
487
|
+
addHarnessMessage("Qdrant", "configured (connection not yet verified)", "ok");
|
|
497
488
|
} else {
|
|
498
489
|
logStartup("[pi-harness] Qdrant ready (no embedding key — skills won't be vector-indexed)");
|
|
490
|
+
addHarnessMessage("Qdrant", "embedding key missing; vector indexing unavailable", "warn");
|
|
499
491
|
logStartup('[pi-harness] For vector search: echo "{openai-api-key}" > ~/.pi-harness-runtime/keys/openai-api-key.txt');
|
|
500
492
|
}
|
|
501
493
|
} else {
|
|
502
494
|
logStartup("[pi-harness] Qdrant not configured. Set keys to enable vector skill search:");
|
|
495
|
+
addHarnessMessage("Qdrant", "not configured", "warn");
|
|
503
496
|
logStartup(` echo "{cluster-url}" > ~/.pi-harness-runtime/keys/qdrant-cluster-url.txt`);
|
|
504
497
|
logStartup(` echo "{api-key}" > ~/.pi-harness-runtime/keys/qdrant-api-key.txt`);
|
|
505
498
|
}
|
|
506
499
|
} catch {
|
|
507
|
-
|
|
500
|
+
addHarnessMessage("Qdrant", "initialization failed", "err");
|
|
508
501
|
}
|
|
509
502
|
}
|
|
510
503
|
|
|
511
504
|
// --- telegram-notifications: Telegram bot for harness event notifications ------------
|
|
512
505
|
// Sends Telegram messages when jobs complete, tasks finish, or human input is needed.
|
|
513
506
|
async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
507
|
+
addHarnessMessage("Telegram", "initializing", "wait");
|
|
514
508
|
try {
|
|
515
509
|
const {
|
|
516
510
|
NotificationCenter,
|
|
@@ -530,10 +524,10 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
530
524
|
logStartup("[pi-harness] 3. echo \"{token}\" > ~/.pi-harness-runtime/keys/telegram-bot-token.txt");
|
|
531
525
|
logStartup("[pi-harness] 4. echo \"{chat-id}\" > ~/.pi-harness-runtime/keys/telegram-chat-id.txt");
|
|
532
526
|
logStartup("[pi-harness] 5. Reload pi — then DM @PiHarnessRuntimeBot to verify");
|
|
533
|
-
addHarnessMessage("Telegram", "
|
|
527
|
+
addHarnessMessage("Telegram", "credentials missing; notifications unavailable", "warn", [
|
|
534
528
|
"echo \"<TOKEN>\" > keys/telegram-bot-token.txt",
|
|
535
529
|
"echo \"<CHAT_ID>\" > keys/telegram-chat-id.txt",
|
|
536
|
-
"Then
|
|
530
|
+
"Then reload Pi.",
|
|
537
531
|
]);
|
|
538
532
|
return;
|
|
539
533
|
}
|
|
@@ -543,6 +537,9 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
543
537
|
|
|
544
538
|
if (!botToken || !chatId) {
|
|
545
539
|
logStartup("[pi-harness] Telegram: bot token or chat ID is empty — skipping");
|
|
540
|
+
addHarnessMessage("Telegram", "bot token or chat ID is empty; notifications unavailable", "warn", [
|
|
541
|
+
"Fill telegram-bot-token.txt and telegram-chat-id.txt in ~/.pi-harness-runtime/keys/, then reload Pi.",
|
|
542
|
+
]);
|
|
546
543
|
return;
|
|
547
544
|
}
|
|
548
545
|
|
|
@@ -559,8 +556,11 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
559
556
|
});
|
|
560
557
|
|
|
561
558
|
await center.initialize();
|
|
562
|
-
if (!center.
|
|
559
|
+
if (!center.hasHealthyChannels()) {
|
|
563
560
|
logStartup("[pi-harness] Telegram: initialization failed — skipping");
|
|
561
|
+
addHarnessMessage("Telegram", "bot verification failed; notifications unavailable", "err", [
|
|
562
|
+
"Check the bot token and network access, then reload Pi.",
|
|
563
|
+
]);
|
|
564
564
|
return;
|
|
565
565
|
}
|
|
566
566
|
|
|
@@ -609,13 +609,17 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
609
609
|
|
|
610
610
|
// Log the actual bot username (fetched from Telegram API via getMe)
|
|
611
611
|
const botUsername = center.getTelegramBotUsername();
|
|
612
|
+
addHarnessMessage("Telegram", "bot verified (chat delivery not tested)", "ok");
|
|
612
613
|
if (botUsername) {
|
|
613
614
|
logStartup(`[pi-harness] Telegram (@${botUsername}) ready — DM the bot to receive alerts`);
|
|
614
615
|
} else {
|
|
615
616
|
logStartup(`[pi-harness] Telegram notifications ready`);
|
|
616
617
|
}
|
|
617
618
|
} catch (err) {
|
|
618
|
-
logStartup("[pi-harness] Telegram: init failed
|
|
619
|
+
logStartup("[pi-harness] Telegram: init failed (check installation, credentials, and network)");
|
|
620
|
+
addHarnessMessage("Telegram", "initialization failed; notifications unavailable", "err", [
|
|
621
|
+
"Check package installation, key-file permissions, and network access, then reload Pi.",
|
|
622
|
+
]);
|
|
619
623
|
}
|
|
620
624
|
}
|
|
621
625
|
|
|
@@ -627,6 +631,8 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
627
631
|
// - Bounded context injection with provenance
|
|
628
632
|
|
|
629
633
|
async function initHoncho(pi: ExtensionAPI): Promise<void> {
|
|
634
|
+
addHarnessMessage("Honcho", "initializing", "wait");
|
|
635
|
+
try {
|
|
630
636
|
// Import new Honcho integration module
|
|
631
637
|
const { initHoncho: honchoInit, registerHonchoLifecycle } = await import("./harness/honcho-init.js");
|
|
632
638
|
|
|
@@ -639,10 +645,10 @@ async function initHoncho(pi: ExtensionAPI): Promise<void> {
|
|
|
639
645
|
logStartup("[pi-harness] Honcho not configured:");
|
|
640
646
|
logStartup("[pi-harness] Get key: https://app.honcho.dev/api-keys");
|
|
641
647
|
logStartup(`[pi-harness] Then: echo "{api-key}" > ~/.pi-harness-runtime/keys/honcho-api-key.txt`);
|
|
642
|
-
addHarnessMessage("Honcho", "API key missing", "
|
|
648
|
+
addHarnessMessage("Honcho", "API key missing", "warn", [
|
|
643
649
|
"Get key: https://app.honcho.dev/api-keys",
|
|
644
650
|
"echo \"<KEY>\" > keys/honcho-api-key.txt",
|
|
645
|
-
"Then
|
|
651
|
+
"Then reload Pi.",
|
|
646
652
|
]);
|
|
647
653
|
return;
|
|
648
654
|
}
|
|
@@ -650,14 +656,13 @@ async function initHoncho(pi: ExtensionAPI): Promise<void> {
|
|
|
650
656
|
const apiKey = readFileSync(keyPath, "utf8").trim();
|
|
651
657
|
if (!apiKey) {
|
|
652
658
|
logStartup("[pi-harness] Honcho: API key is empty — skipping");
|
|
653
|
-
addHarnessMessage("Honcho", "API key empty", "
|
|
659
|
+
addHarnessMessage("Honcho", "API key empty", "warn", [
|
|
654
660
|
"echo \"<KEY>\" > keys/honcho-api-key.txt",
|
|
655
|
-
"Then
|
|
661
|
+
"Then reload Pi.",
|
|
656
662
|
]);
|
|
657
663
|
return;
|
|
658
664
|
}
|
|
659
665
|
|
|
660
|
-
try {
|
|
661
666
|
// Register lifecycle hooks using the new integration
|
|
662
667
|
// SAFETY: pi.on accepts these event names at runtime
|
|
663
668
|
registerHonchoLifecycle(pi as unknown as { on: (event: string, handler: (...args: unknown[]) => void | Promise<void>) => void });
|
|
@@ -668,8 +673,10 @@ async function initHoncho(pi: ExtensionAPI): Promise<void> {
|
|
|
668
673
|
|
|
669
674
|
if (result) {
|
|
670
675
|
logStartup("[pi-harness] Honcho integration ready");
|
|
676
|
+
addHarnessMessage("Honcho", "initialized", "ok");
|
|
671
677
|
} else {
|
|
672
678
|
logStartup("[pi-harness] Honcho: initialization returned null");
|
|
679
|
+
addHarnessMessage("Honcho", "initialization returned no client", "err");
|
|
673
680
|
}
|
|
674
681
|
} catch (err) {
|
|
675
682
|
logStartup("[pi-harness] Honcho: init failed:", err instanceof Error ? err.message : String(err));
|
|
@@ -1100,6 +1107,7 @@ async function initLoopCompletions(pi: ExtensionAPI): Promise<void> {
|
|
|
1100
1107
|
* - Scan skills from ~/.pi-harness-runtime/skills/
|
|
1101
1108
|
*/
|
|
1102
1109
|
async function initHermesSkills(pi: ExtensionAPI): Promise<void> {
|
|
1110
|
+
addHarnessMessage("Skills", "initializing", "wait");
|
|
1103
1111
|
try {
|
|
1104
1112
|
// Dynamically import to avoid circular deps
|
|
1105
1113
|
const { initSkills } =
|
|
@@ -1108,6 +1116,7 @@ async function initHermesSkills(pi: ExtensionAPI): Promise<void> {
|
|
|
1108
1116
|
// Scan skills from default locations
|
|
1109
1117
|
const result = initSkills();
|
|
1110
1118
|
logStartup(`[pi-harness] Scanned ${result.skills.length} skills`);
|
|
1119
|
+
addHarnessMessage("Skills", `${result.skills.length} discovered`, "ok");
|
|
1111
1120
|
|
|
1112
1121
|
// Register /skill commands
|
|
1113
1122
|
try {
|
|
@@ -1147,6 +1156,7 @@ async function initHermesSkills(pi: ExtensionAPI): Promise<void> {
|
|
|
1147
1156
|
|
|
1148
1157
|
} catch (err) {
|
|
1149
1158
|
logStartup(`[pi-harness] Failed to initialize skills:`, err instanceof Error ? err.message : String(err));
|
|
1159
|
+
addHarnessMessage("Skills", "initialization failed", "err");
|
|
1150
1160
|
}
|
|
1151
1161
|
}
|
|
1152
1162
|
|
|
@@ -1604,7 +1614,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
1604
1614
|
void initSshDetachInterceptor(pi);
|
|
1605
1615
|
|
|
1606
1616
|
// --- jev-auto-continue: Agent autonomous decision when user unavailable -----
|
|
1607
|
-
|
|
1617
|
+
asyncInitPromises.push(initAutoContinue(pi));
|
|
1608
1618
|
|
|
1609
1619
|
// Register todo-driven continuation controller
|
|
1610
1620
|
createTodoContinuation(pi);
|
|
@@ -3080,24 +3090,12 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3080
3090
|
// - Tree characters like Todos (├─ └─)
|
|
3081
3091
|
// - Trailing spacer line for breathing room
|
|
3082
3092
|
const HARNESS_WIDGET_KEY = "pi-harness-startup";
|
|
3083
|
-
interface HarnessMessage {
|
|
3084
|
-
id: string;
|
|
3085
|
-
label: string;
|
|
3086
|
-
text: string;
|
|
3087
|
-
status: "wait" | "ok" | "err";
|
|
3088
|
-
details?: string[]; // Multi-line fix instructions for errors
|
|
3089
|
-
}
|
|
3090
|
-
const harnessMessages: HarnessMessage[] = [];
|
|
3091
3093
|
let startupVisible = true;
|
|
3092
3094
|
let harnessTUI: { requestRender: (forced?: boolean) => void } | null = null;
|
|
3093
3095
|
let harnessWidgetRegistered = false;
|
|
3094
3096
|
let sessionGeneration = 0;
|
|
3095
3097
|
|
|
3096
|
-
|
|
3097
|
-
const id = `${label}-${Date.now()}`;
|
|
3098
|
-
harnessMessages.push({ id, label, text, status, details });
|
|
3099
|
-
harnessTUI?.requestRender();
|
|
3100
|
-
}
|
|
3098
|
+
startupStatus.onChange = () => harnessTUI?.requestRender();
|
|
3101
3099
|
|
|
3102
3100
|
function hideHarnessBlock() {
|
|
3103
3101
|
startupVisible = false;
|
|
@@ -3131,7 +3129,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3131
3129
|
|
|
3132
3130
|
for (let i = 0; i < harnessMessages.length; i++) {
|
|
3133
3131
|
const msg = harnessMessages[i];
|
|
3134
|
-
const marker = msg.status
|
|
3132
|
+
const marker = harnessStatusMarker(msg.status);
|
|
3135
3133
|
const isLast = i === harnessMessages.length - 1;
|
|
3136
3134
|
const treeChar = isLast ? "└─" : "├─";
|
|
3137
3135
|
let text = `${treeChar} ${marker} ${msg.label}: ${msg.text}`;
|
|
@@ -3139,7 +3137,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3139
3137
|
lines.push(text);
|
|
3140
3138
|
|
|
3141
3139
|
// Add fix instructions for errors (indented)
|
|
3142
|
-
if (msg.status === "err" && msg.details && msg.details.length > 0) {
|
|
3140
|
+
if ((msg.status === "err" || msg.status === "warn") && msg.details && msg.details.length > 0) {
|
|
3143
3141
|
for (const detail of msg.details) {
|
|
3144
3142
|
const detailLine = `${isLast ? " " : "│ "} Fix: ${detail}`;
|
|
3145
3143
|
lines.push(truncateToWidth(detailLine, width));
|
|
@@ -3170,7 +3168,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3170
3168
|
sessionGeneration++;
|
|
3171
3169
|
const mySession = sessionGeneration;
|
|
3172
3170
|
startupVisible = true;
|
|
3173
|
-
|
|
3171
|
+
// Service states survive session changes; initialization runs once per extension load.
|
|
3174
3172
|
harnessWidgetRegistered = false; // Reset for new session
|
|
3175
3173
|
|
|
3176
3174
|
// --- Install harness widget (like Todos with placement: "aboveEditor") -------
|
|
@@ -3189,13 +3187,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3189
3187
|
);
|
|
3190
3188
|
harnessWidgetRegistered = true;
|
|
3191
3189
|
|
|
3192
|
-
|
|
3193
|
-
for (const err of preSessionErrors) {
|
|
3194
|
-
harnessMessages.push(err);
|
|
3195
|
-
}
|
|
3196
|
-
preSessionErrors.length = 0; // Clear pre-session errors
|
|
3197
|
-
|
|
3198
|
-
harnessTUI?.requestRender(); // Show widget with error messages
|
|
3190
|
+
harnessTUI?.requestRender();
|
|
3199
3191
|
} else {
|
|
3200
3192
|
harnessTUI?.requestRender();
|
|
3201
3193
|
}
|
|
@@ -3203,42 +3195,19 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3203
3195
|
// Add initial harness message
|
|
3204
3196
|
addHarnessMessage("Harness Runtime", `v${HARNESS_VERSION} initializing`, "wait");
|
|
3205
3197
|
|
|
3206
|
-
//
|
|
3207
|
-
const startupTimeout =
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
startupTimeout
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
if (runtimeMsg) {
|
|
3220
|
-
runtimeMsg.status = "ok";
|
|
3221
|
-
runtimeMsg.text = `v${HARNESS_VERSION} initialized`;
|
|
3222
|
-
}
|
|
3223
|
-
|
|
3224
|
-
// Add service messages from startup
|
|
3225
|
-
for (const msg of startupMessages) {
|
|
3226
|
-
if (msg.includes("Qdrant") && msg.includes("ready")) {
|
|
3227
|
-
addHarnessMessage("Qdrant", "connected", "ok");
|
|
3228
|
-
}
|
|
3229
|
-
if (msg.includes("Telegram") && msg.includes("ready")) {
|
|
3230
|
-
addHarnessMessage("Telegram", "verified", "ok");
|
|
3231
|
-
}
|
|
3232
|
-
if (msg.includes("Honcho")) {
|
|
3233
|
-
addHarnessMessage("Honcho", "registered", "ok");
|
|
3234
|
-
}
|
|
3235
|
-
if (msg.includes("Scanned") && msg.includes("skills")) {
|
|
3236
|
-
const match = msg.match(/Scanned (\d+)/);
|
|
3237
|
-
if (match) {
|
|
3238
|
-
addHarnessMessage("Skills", `${match[1]} discovered`, "ok");
|
|
3239
|
-
}
|
|
3240
|
-
}
|
|
3241
|
-
}
|
|
3198
|
+
// A timeout is not success. Keep accepting late service updates.
|
|
3199
|
+
const startupTimeout = setTimeout(() => {
|
|
3200
|
+
if (mySession !== sessionGeneration) return;
|
|
3201
|
+
addHarnessMessage("Harness Runtime", `v${HARNESS_VERSION} waiting for service initialization`, "warn");
|
|
3202
|
+
}, 5000);
|
|
3203
|
+
Promise.allSettled(asyncInitPromises).then((results) => {
|
|
3204
|
+
clearTimeout(startupTimeout);
|
|
3205
|
+
if (mySession !== sessionGeneration) return;
|
|
3206
|
+
const degraded = results.some((result) => result.status === "rejected") ||
|
|
3207
|
+
harnessMessages.some((msg) => msg.label !== "Harness Runtime" && msg.status !== "ok");
|
|
3208
|
+
addHarnessMessage("Harness Runtime",
|
|
3209
|
+
`v${HARNESS_VERSION} ${degraded ? "initialized with unavailable services" : "initialized"}`,
|
|
3210
|
+
degraded ? "warn" : "ok");
|
|
3242
3211
|
});
|
|
3243
3212
|
});
|
|
3244
3213
|
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAepB;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAiTN;AAmED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAiBtD"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - harness_rules tool: retrieve and acknowledge rules
|
|
8
8
|
*/
|
|
9
9
|
import { PolicyLoader } from "./policy-loader.js";
|
|
10
|
+
import { logError, logInfo } from "./file-logger.js";
|
|
10
11
|
import { getPolicyStore } from "./policy-store.js";
|
|
11
12
|
import { renderSystemContract, renderFullRules, } from "./policy-renderer.js";
|
|
12
13
|
import { classifyToolCall } from "./types.js";
|
|
@@ -48,12 +49,12 @@ export function registerAgentPolicy(pi, config) {
|
|
|
48
49
|
// Build augmented system prompt
|
|
49
50
|
const augmentedPrompt = event.systemPrompt + "\n\n" + contract;
|
|
50
51
|
// Log for debugging
|
|
51
|
-
|
|
52
|
+
logInfo("[agent-policy]", `Delivered policy ${manifest.revision} to session ${receipt.sessionId}`);
|
|
52
53
|
return { systemPrompt: augmentedPrompt };
|
|
53
54
|
}
|
|
54
55
|
catch (err) {
|
|
55
56
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
56
|
-
|
|
57
|
+
logError("[agent-policy]", `Failed to load policy: ${errorMessage}`);
|
|
57
58
|
// Return minimal contract on failure - don't block startup
|
|
58
59
|
const fallbackContract = `
|
|
59
60
|
PI-HARNESS POLICY coverage=degraded
|
|
@@ -86,7 +87,7 @@ Use harness_rules to check policy status.
|
|
|
86
87
|
const blockReason = receipt
|
|
87
88
|
? `Policy revision changed (expected ${manifest.revision}, received ${receipt.revision})`
|
|
88
89
|
: `Policy revision ${manifest.revision} not yet delivered`;
|
|
89
|
-
|
|
90
|
+
logInfo("[agent-policy]", `Blocked ${toolName}: ${blockReason}`);
|
|
90
91
|
const reason = `[POLICY REQUIRED] ${blockReason}\n\n` +
|
|
91
92
|
`To proceed, you must acknowledge the harness rules:\n` +
|
|
92
93
|
`1. Run: harness_rules({ action: "manifest" })\n` +
|
|
@@ -110,7 +111,7 @@ Use harness_rules to check policy status.
|
|
|
110
111
|
}
|
|
111
112
|
catch (err) {
|
|
112
113
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
113
|
-
|
|
114
|
+
logError("[agent-policy]", `Policy check failed: ${errorMessage}`);
|
|
114
115
|
// On error, fail open for the command but log the issue
|
|
115
116
|
// This matches pi-lens's total handler guard behavior
|
|
116
117
|
return {};
|
|
@@ -239,7 +240,7 @@ Use harness_rules to check policy status.
|
|
|
239
240
|
}
|
|
240
241
|
catch (err) {
|
|
241
242
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
242
|
-
|
|
243
|
+
logError("[agent-policy]", `harness_rules failed: ${errorMessage}`);
|
|
243
244
|
return {
|
|
244
245
|
content: [{
|
|
245
246
|
type: "text",
|
|
@@ -257,7 +258,7 @@ Use harness_rules to check policy status.
|
|
|
257
258
|
pi.on("session_start", (_event, ctx) => {
|
|
258
259
|
const sessionId = getSessionIdFromCtx(ctx, fallbackSessionId);
|
|
259
260
|
const cwd = getCwdFromContext(ctx);
|
|
260
|
-
|
|
261
|
+
logInfo("[agent-policy]", `Session started: ${sessionId} in ${cwd}`);
|
|
261
262
|
});
|
|
262
263
|
// ---------------------------------------------------------------------------
|
|
263
264
|
// agent_end: Cleanup
|
|
@@ -265,7 +266,7 @@ Use harness_rules to check policy status.
|
|
|
265
266
|
pi.on("agent_end", () => {
|
|
266
267
|
// Cleanup is silent - verbose logging is noisy in TUI
|
|
267
268
|
});
|
|
268
|
-
|
|
269
|
+
logInfo("[agent-policy]", "Registered agent policy runtime");
|
|
269
270
|
}
|
|
270
271
|
// ---------------------------------------------------------------------------
|
|
271
272
|
// Helpers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAgB,EAChB,MAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;KAClD,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,gBAAgB,CAAC;IACjE,MAAM,iBAAiB,GAAG,UAAU,UAAU,EAAE,EAAE,CAAC;IAEnD,gCAAgC;IAChC,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,kDAAkD;IAClD,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAwB,EAAE,EAAE;QACxD,4DAA4D;QAC5D,MAAM,cAAc,GAAI,KAAuC,CAAC,cAAc,IAAI,EAAE,CAAC;QACrF,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,6CAA6C;IAC7C,8EAA8E;IAE9E,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAA4B,EAAE,GAAG,EAAE,EAAE;QACtE,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAExC,2BAA2B;YAC3B,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CACjC,SAAS,EACT,QAAQ,EACR,eAAe,CAChB,CAAC;YAEF,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAEhD,gCAAgC;YAChC,MAAM,eAAe,GAAG,KAAK,CAAC,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;YAE/D,oBAAoB;YACpB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File logger for agent-policy package
|
|
3
|
+
* Routes console output to file to avoid TUI interference
|
|
4
|
+
*/
|
|
5
|
+
export declare function logToFile(prefix: string, ...parts: unknown[]): void;
|
|
6
|
+
export declare function logError(prefix: string, msg: string): void;
|
|
7
|
+
export declare function logInfo(prefix: string, ...parts: unknown[]): void;
|
|
8
|
+
export declare function logWarn(prefix: string, msg: string): void;
|
|
9
|
+
//# sourceMappingURL=file-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-logger.d.ts","sourceRoot":"","sources":["../src/file-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CASnE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAEjE;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File logger for agent-policy package
|
|
3
|
+
* Routes console output to file to avoid TUI interference
|
|
4
|
+
*/
|
|
5
|
+
import { appendFileSync } from "node:fs";
|
|
6
|
+
const LOG_FILE = "/tmp/pi-harness-agent-policy.log";
|
|
7
|
+
export function logToFile(prefix, ...parts) {
|
|
8
|
+
try {
|
|
9
|
+
const msg = parts
|
|
10
|
+
.map((p) => (typeof p === "string" ? p : JSON.stringify(p)))
|
|
11
|
+
.join(" ");
|
|
12
|
+
appendFileSync(LOG_FILE, `[${new Date().toISOString()}] ${prefix} ${msg}\n`);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// Silently fail if logging fails
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function logError(prefix, msg) {
|
|
19
|
+
logToFile(prefix, msg);
|
|
20
|
+
}
|
|
21
|
+
export function logInfo(prefix, ...parts) {
|
|
22
|
+
logToFile(prefix, ...parts);
|
|
23
|
+
}
|
|
24
|
+
export function logWarn(prefix, msg) {
|
|
25
|
+
logToFile(prefix, msg);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=file-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-logger.js","sourceRoot":"","sources":["../src/file-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,GAAG,KAAgB;IAC5D,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,KAAK;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,cAAc,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACR,iCAAiC;IAClC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,GAAW;IACnD,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,GAAG,KAAgB;IAC1D,SAAS,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,GAAW;IAClD,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-loader.d.ts","sourceRoot":"","sources":["../src/policy-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"policy-loader.d.ts","sourceRoot":"","sources":["../src/policy-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AAiC/D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,gBAAgB,EAAE,GAAG,CAAC;IACtB,6CAA6C;IAC7C,oBAAoB,CAAC,EAAE,GAAG,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,oBAAoB,CAAQ;IACpC,OAAO,CAAC,KAAK,CAA0E;IACvF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAErC,YAAY,MAAM,EAAE,kBAAkB,EAGrC;IAED;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAWvD;IAED;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAMrF;IAED;;OAEG;IACH,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAM1C;IAED;;OAEG;YACW,aAAa;IAsC3B;;OAEG;YACW,gBAAgB;IAkD9B;;OAEG;YACW,gBAAgB;IA8C9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7C;CACF;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAwBjD"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
11
11
|
import { existsSync, readFileSync } from "node:fs";
|
|
12
12
|
import { dirname, join, relative, resolve } from "node:path";
|
|
13
|
+
import { logError, logInfo, logWarn } from "./file-logger.js";
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
// Constants
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -157,7 +158,7 @@ export class PolicyLoader {
|
|
|
157
158
|
});
|
|
158
159
|
}
|
|
159
160
|
catch (err) {
|
|
160
|
-
|
|
161
|
+
logError("[agent-policy]", `Failed to load additional rules from ${rulesPath}: ${err}`);
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
}
|
|
@@ -191,7 +192,7 @@ export class PolicyLoader {
|
|
|
191
192
|
});
|
|
192
193
|
}
|
|
193
194
|
catch (err) {
|
|
194
|
-
|
|
195
|
+
logError("[agent-policy]", `Failed to load project rule ${filePath}: ${err}`);
|
|
195
196
|
}
|
|
196
197
|
}
|
|
197
198
|
}
|
|
@@ -323,10 +324,10 @@ export function createPolicyLoader() {
|
|
|
323
324
|
// Log which file we're using (for debugging)
|
|
324
325
|
const usingFile = harnessRulesPath.toString().includes("AGENTS") ? "AGENTS.md" : "RULES.md";
|
|
325
326
|
if (existsSync(harnessRulesPath)) {
|
|
326
|
-
|
|
327
|
+
logInfo("[agent-policy]", `Using harness rules: ${usingFile}`);
|
|
327
328
|
}
|
|
328
329
|
else {
|
|
329
|
-
|
|
330
|
+
logWarn("[agent-policy]", `WARNING: Neither AGENTS.md nor RULES.md found in package root`);
|
|
330
331
|
}
|
|
331
332
|
return new PolicyLoader({
|
|
332
333
|
harnessRulesPath,
|