pi-harness-runtime 1.1.148 → 1.1.152
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/CHANGELOG.md +7 -0
- package/harness/key-loader.ts +84 -0
- package/harness/langchain/agents.ts +65 -15
- package/harness/langchain/daemon.ts +58 -30
- package/harness/langchain/graph.ts +55 -7
- package/harness/langchain/jev-logger.ts +274 -0
- package/harness/langchain/run.ts +64 -161
- package/harness/langchain/surge.test.ts +42 -0
- package/harness/langchain/surge.ts +22 -1
- package/index.ts +65 -26
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/dist/extension.d.ts +19 -0
- package/packages/agent-policy/dist/extension.d.ts.map +1 -0
- package/packages/agent-policy/dist/extension.js +322 -0
- package/packages/agent-policy/dist/extension.js.map +1 -0
- package/packages/agent-policy/dist/index.d.ts +25 -0
- package/packages/agent-policy/dist/index.d.ts.map +1 -0
- package/packages/agent-policy/dist/index.js +27 -0
- package/packages/agent-policy/dist/index.js.map +1 -0
- package/packages/agent-policy/dist/policy-loader.d.ts +90 -0
- package/packages/agent-policy/dist/policy-loader.d.ts.map +1 -0
- package/packages/agent-policy/dist/policy-loader.js +331 -0
- package/packages/agent-policy/dist/policy-loader.js.map +1 -0
- package/packages/agent-policy/dist/policy-renderer.d.ts +42 -0
- package/packages/agent-policy/dist/policy-renderer.d.ts.map +1 -0
- package/packages/agent-policy/dist/policy-renderer.js +295 -0
- package/packages/agent-policy/dist/policy-renderer.js.map +1 -0
- package/packages/agent-policy/dist/policy-store.d.ts +99 -0
- package/packages/agent-policy/dist/policy-store.d.ts.map +1 -0
- package/packages/agent-policy/dist/policy-store.js +244 -0
- package/packages/agent-policy/dist/policy-store.js.map +1 -0
- package/packages/agent-policy/dist/types.d.ts +237 -0
- package/packages/agent-policy/dist/types.d.ts.map +1 -0
- package/packages/agent-policy/dist/types.js +130 -0
- package/packages/agent-policy/dist/types.js.map +1 -0
- package/packages/agent-policy/package.json +45 -0
- package/packages/agent-policy/src/extension.ts +413 -0
- package/packages/agent-policy/src/index.ts +52 -0
- package/packages/agent-policy/src/policy-loader.ts +398 -0
- package/packages/agent-policy/src/policy-renderer.ts +362 -0
- package/packages/agent-policy/src/policy-store.ts +319 -0
- package/packages/agent-policy/src/types.ts +385 -0
- package/packages/agent-policy/test/policy.test.ts +383 -0
- 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/dist/src/parser.d.ts.map +1 -1
- package/packages/codex-watcher/dist/src/parser.js +35 -0
- package/packages/codex-watcher/dist/src/parser.js.map +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/codex-watcher/src/parser.ts +41 -0
- 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/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/dist/adapters/telegram-adapter.d.ts +5 -0
- package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/telegram-adapter.js +54 -0
- package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
- package/packages/notification/dist/notification-center.d.ts +13 -0
- package/packages/notification/dist/notification-center.d.ts.map +1 -1
- package/packages/notification/dist/notification-center.js +36 -0
- package/packages/notification/dist/notification-center.js.map +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/notification/src/adapters/telegram-adapter.ts +71 -0
- package/packages/notification/src/notification-center.ts +53 -0
- 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/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
- package/proactive-compact.ts +2 -2
- package/scripts/debug-codex-integration.ts +203 -0
- package/scripts/sync-keys-from-pi.ts +188 -0
- package/scripts/test-codex-session.ts +23 -0
- package/scripts/test-openai.ts +14 -0
- package/scripts/test-telegram.ts +34 -0
package/index.ts
CHANGED
|
@@ -297,7 +297,7 @@ async function initTelegram(): Promise<void> {
|
|
|
297
297
|
|
|
298
298
|
await center.initialize();
|
|
299
299
|
if (!center.hasChannels()) {
|
|
300
|
-
|
|
300
|
+
logStartup("[pi-harness] Telegram: initialization failed — skipping");
|
|
301
301
|
return;
|
|
302
302
|
}
|
|
303
303
|
|
|
@@ -544,7 +544,7 @@ function initLangChain(pi: {
|
|
|
544
544
|
if (!coderKeyExists) missingKeys.push("coder-api-key.txt");
|
|
545
545
|
console.error(`[pi-harness] /langchain missing API keys: ${missingKeys.join(", ")}`);
|
|
546
546
|
} else {
|
|
547
|
-
|
|
547
|
+
logStartup(`[pi-harness] /langchain ready (${activeConfig.planner.id} + ${activeConfig.coder.id} + ${activeConfig.reviewer.id})`);
|
|
548
548
|
}
|
|
549
549
|
|
|
550
550
|
pi.registerCommand("langchain", {
|
|
@@ -648,6 +648,27 @@ async function initFileCopyHelper(pi: ExtensionAPI): Promise<void> {
|
|
|
648
648
|
}
|
|
649
649
|
}
|
|
650
650
|
|
|
651
|
+
// --- agent-policy: Mandatory rule delivery and mutation gating ------------------
|
|
652
|
+
// Lazy import - only loads when packages/agent-policy exists
|
|
653
|
+
// This replaces firstAgentStart-only injection with:
|
|
654
|
+
// - System prompt injection on EVERY agent start (not just first)
|
|
655
|
+
// - Policy receipt tracking per session
|
|
656
|
+
// - Mutation gating until policy revision is confirmed received
|
|
657
|
+
// - harness_rules tool for rule retrieval and acknowledgement
|
|
658
|
+
async function initAgentPolicy(pi: ExtensionAPI): Promise<void> {
|
|
659
|
+
try {
|
|
660
|
+
const { registerAgentPolicy } = await import("./packages/agent-policy/src/extension.js");
|
|
661
|
+
registerAgentPolicy(pi, {
|
|
662
|
+
harnessRulesPath: new URL("./AGENTS.md", import.meta.url),
|
|
663
|
+
requireReceiptBeforeMutation: true,
|
|
664
|
+
lspMode: "pi-lens",
|
|
665
|
+
});
|
|
666
|
+
logStartup("[pi-harness] Agent policy initialized");
|
|
667
|
+
} catch (err) {
|
|
668
|
+
logStartup(`[pi-harness] Agent policy init failed: ${err}`);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
651
672
|
// --- SSH detach interceptor: Auto-transform bare ssh ... & to detached pattern ---
|
|
652
673
|
// Prevents 2000+ second hangs when SSH background commands aren't detached.
|
|
653
674
|
// Intercepts every bash tool call before execution and rewrites risky SSH commands.
|
|
@@ -762,19 +783,19 @@ async function initHermesSkills(pi: ExtensionAPI): Promise<void> {
|
|
|
762
783
|
|
|
763
784
|
// Scan skills from default locations
|
|
764
785
|
const result = initSkills();
|
|
765
|
-
|
|
786
|
+
logStartup(`[pi-harness] Scanned ${result.skills.length} skills`);
|
|
766
787
|
|
|
767
788
|
// Register /skill commands
|
|
768
789
|
try {
|
|
769
790
|
const { initSkillCommands } = await import("./packages/skills/src/skill-commands.js");
|
|
770
791
|
initSkillCommands(pi);
|
|
771
|
-
|
|
792
|
+
logStartup("[pi-harness] Registered skill commands");
|
|
772
793
|
} catch (err) {
|
|
773
|
-
|
|
794
|
+
logStartup(`[pi-harness] Failed to register skill commands:`, err instanceof Error ? err.message : String(err));
|
|
774
795
|
}
|
|
775
796
|
|
|
776
797
|
} catch (err) {
|
|
777
|
-
|
|
798
|
+
logStartup(`[pi-harness] Failed to initialize skills:`, err instanceof Error ? err.message : String(err));
|
|
778
799
|
}
|
|
779
800
|
}
|
|
780
801
|
|
|
@@ -947,7 +968,7 @@ function ensureHarnessDir() {
|
|
|
947
968
|
}
|
|
948
969
|
// Create symlink so pi.dev discovers our skills
|
|
949
970
|
ensurePiSkillsSymlink();
|
|
950
|
-
|
|
971
|
+
logStartup(
|
|
951
972
|
`[pi-harness] Initialized ~/.pi-harness-runtime/ with skills/, memory/, trajectory/, cookies/`,
|
|
952
973
|
);
|
|
953
974
|
}
|
|
@@ -971,7 +992,7 @@ function ensurePiSkillsSymlink(): void {
|
|
|
971
992
|
|
|
972
993
|
// Create symlink: ~/.pi/skills -> ~/.pi-harness-runtime/skills
|
|
973
994
|
symlinkSync(SKILLS_DIR, PI_SKILLS_DIR, "junction");
|
|
974
|
-
|
|
995
|
+
logStartup(`[pi-harness] Created skills symlink: ~/.pi/skills -> ~/.pi-harness-runtime/skills`);
|
|
975
996
|
} catch {
|
|
976
997
|
// Ignore errors (may fail due to permissions or existing file)
|
|
977
998
|
// User can create the symlink manually if needed
|
|
@@ -1157,6 +1178,9 @@ export default function (pi: ExtensionAPI) {
|
|
|
1157
1178
|
const mirrorStore = new MirrorStore();
|
|
1158
1179
|
ensureHarnessDir();
|
|
1159
1180
|
|
|
1181
|
+
// Collect async init promises so we can wait for them before showing startup notification
|
|
1182
|
+
const asyncInitPromises: Promise<unknown>[] = [];
|
|
1183
|
+
|
|
1160
1184
|
// --- todo-bd-sync: Initialize two-way sync with bd ---------------
|
|
1161
1185
|
// Start async init but don't await - runs in background
|
|
1162
1186
|
void initTodoBdSync(pi);
|
|
@@ -1170,6 +1194,9 @@ export default function (pi: ExtensionAPI) {
|
|
|
1170
1194
|
// --- file-copy-helper: Inject cp rule when mimicking files -------------
|
|
1171
1195
|
void initFileCopyHelper(pi);
|
|
1172
1196
|
|
|
1197
|
+
// --- agent-policy: Mandatory rule delivery and mutation gating -------------
|
|
1198
|
+
void initAgentPolicy(pi);
|
|
1199
|
+
|
|
1173
1200
|
// --- ssh-detach-interceptor: Auto-fix bare ssh & → nohup pattern ---------
|
|
1174
1201
|
void initSshDetachInterceptor(pi);
|
|
1175
1202
|
|
|
@@ -1177,16 +1204,17 @@ export default function (pi: ExtensionAPI) {
|
|
|
1177
1204
|
void initAutoContinue(pi);
|
|
1178
1205
|
|
|
1179
1206
|
// --- qdrant-vector-search: Qdrant integration for semantic skill search ----
|
|
1180
|
-
|
|
1207
|
+
// Collect promise so we can wait for initialization before showing startup notification
|
|
1208
|
+
asyncInitPromises.push(initQdrant());
|
|
1181
1209
|
|
|
1182
1210
|
// --- telegram-notifications: Telegram bot for harness event notifications ----
|
|
1183
|
-
|
|
1211
|
+
// Collect promise so we can wait for initialization before showing startup notification
|
|
1212
|
+
asyncInitPromises.push(initTelegram());
|
|
1184
1213
|
|
|
1185
1214
|
// --- codex-watcher: Inject Codex plans into pi.dev + Telegram --------------
|
|
1186
1215
|
// Lightweight: polls ~/.codex/sessions/ every 5s, no LangChain daemon.
|
|
1187
1216
|
// On plan detected: sends Telegram alert + steer message to pi.dev.
|
|
1188
1217
|
try {
|
|
1189
|
-
let latestCodexSession = "";
|
|
1190
1218
|
let latestPlanOrdinal = 0;
|
|
1191
1219
|
|
|
1192
1220
|
const codexHandle = startWatcher({
|
|
@@ -1194,7 +1222,6 @@ export default function (pi: ExtensionAPI) {
|
|
|
1194
1222
|
maxIdlePolls: Infinity,
|
|
1195
1223
|
onSessionChange: (session) => {
|
|
1196
1224
|
if (session) {
|
|
1197
|
-
latestCodexSession = session.id;
|
|
1198
1225
|
console.error(`[codex] Session started: ${session.threadName}`);
|
|
1199
1226
|
nc("CodexSessionStarted", {
|
|
1200
1227
|
requirement: session.threadName || "Codex session",
|
|
@@ -1236,15 +1263,14 @@ ${planPreview}`,
|
|
|
1236
1263
|
});
|
|
1237
1264
|
|
|
1238
1265
|
// Clean up when pi session ends
|
|
1239
|
-
|
|
1240
|
-
codexHandle.stop();
|
|
1241
|
-
});
|
|
1266
|
+
pi.on("session_shutdown", () => codexHandle.stop());
|
|
1242
1267
|
} catch {
|
|
1243
1268
|
// Codex watcher unavailable (e.g. no codex package installed)
|
|
1244
1269
|
}
|
|
1245
1270
|
|
|
1246
1271
|
// --- honcho-memory: Honcho MCP for peer/user memory (honcho_profile, etc.) ----
|
|
1247
|
-
|
|
1272
|
+
// Collect promise so we can wait for initialization before showing startup notification
|
|
1273
|
+
asyncInitPromises.push(initHoncho(pi));
|
|
1248
1274
|
|
|
1249
1275
|
// --- moocoding-sync-hint: Suggest skill sync if skills dir is empty --------
|
|
1250
1276
|
void initMoocodingSyncHint();
|
|
@@ -1297,7 +1323,8 @@ ${planPreview}`,
|
|
|
1297
1323
|
|
|
1298
1324
|
// --- Hermes-style skills: Initialize skill system ----------------------
|
|
1299
1325
|
// Scan skills from ~/.pi-harness-runtime/skills/ and register with pi.dev
|
|
1300
|
-
|
|
1326
|
+
// Collect promise so we can wait for initialization before showing startup notification
|
|
1327
|
+
asyncInitPromises.push(initHermesSkills(pi));
|
|
1301
1328
|
|
|
1302
1329
|
// --- Job pipe watcher: Listen for Telegram callback commands -----------
|
|
1303
1330
|
// Watch for resume/cancel commands from telegram-callback-processor
|
|
@@ -2654,20 +2681,32 @@ Run \`bd ready\` to see current bd issues.
|
|
|
2654
2681
|
() => lastActiveProvider,
|
|
2655
2682
|
);
|
|
2656
2683
|
|
|
2657
|
-
// --- Show harness
|
|
2684
|
+
// --- Show harness startup block (pi header stays intact) -----------
|
|
2658
2685
|
// Do NOT call setHeader() — that replaces pi's ASCII header which shows
|
|
2659
2686
|
// community shortcuts (ctrl+c/d, /, !, ctrl+o). Keep pi's header and add
|
|
2660
2687
|
// harness info as a small separate notify line.
|
|
2688
|
+
//
|
|
2689
|
+
// Wait for all async init promises to complete so startupMessages includes
|
|
2690
|
+
// messages from async initializations (Qdrant, Telegram, Honcho, HermesSkills).
|
|
2691
|
+
// Use a timeout to avoid indefinite blocking if an init stalls.
|
|
2661
2692
|
if (ctx.hasUI) {
|
|
2662
|
-
ctx.ui.notify(
|
|
2663
|
-
}
|
|
2693
|
+
const notify = ctx.ui.notify.bind(ctx.ui);
|
|
2664
2694
|
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2695
|
+
// Wait for async inits to complete, then emit notification
|
|
2696
|
+
// Use Promise.race with a timeout to avoid indefinite blocking
|
|
2697
|
+
const startupTimeout = new Promise<void>((resolve) => {
|
|
2698
|
+
setTimeout(resolve, 5000); // 5 second timeout
|
|
2699
|
+
});
|
|
2700
|
+
Promise.race([
|
|
2701
|
+
Promise.allSettled(asyncInitPromises),
|
|
2702
|
+
startupTimeout,
|
|
2703
|
+
]).then(() => {
|
|
2704
|
+
const lines = [
|
|
2705
|
+
`Harness v${HARNESS_VERSION} — quota management, automation, memory, multi-agent`,
|
|
2706
|
+
...startupMessages,
|
|
2707
|
+
];
|
|
2708
|
+
notify(lines.join("\n"), "info");
|
|
2709
|
+
});
|
|
2671
2710
|
}
|
|
2672
2711
|
});
|
|
2673
2712
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Policy Extension
|
|
3
|
+
*
|
|
4
|
+
* Registers the policy runtime with Pi's event system:
|
|
5
|
+
* - before_agent_start: inject system contract
|
|
6
|
+
* - tool_call: gate mutations until policy received
|
|
7
|
+
* - harness_rules tool: retrieve and acknowledge rules
|
|
8
|
+
*/
|
|
9
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
10
|
+
import type { AgentPolicyConfig } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Register the agent policy runtime with Pi.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerAgentPolicy(pi: ExtensionAPI, config: AgentPolicyConfig): void;
|
|
15
|
+
/**
|
|
16
|
+
* Register with default configuration pointing to harness AGENTS.md.
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerDefault(pi: ExtensionAPI): void;
|
|
19
|
+
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -0,0 +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;AAapB;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CA8SN;AA8DD;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAQtD"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Policy Extension
|
|
3
|
+
*
|
|
4
|
+
* Registers the policy runtime with Pi's event system:
|
|
5
|
+
* - before_agent_start: inject system contract
|
|
6
|
+
* - tool_call: gate mutations until policy received
|
|
7
|
+
* - harness_rules tool: retrieve and acknowledge rules
|
|
8
|
+
*/
|
|
9
|
+
import { PolicyLoader } from "./policy-loader.js";
|
|
10
|
+
import { getPolicyStore } from "./policy-store.js";
|
|
11
|
+
import { renderSystemContract, renderFullRules, } from "./policy-renderer.js";
|
|
12
|
+
import { classifyToolCall } from "./types.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Extension Registration
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Register the agent policy runtime with Pi.
|
|
18
|
+
*/
|
|
19
|
+
export function registerAgentPolicy(pi, config) {
|
|
20
|
+
const loader = new PolicyLoader({
|
|
21
|
+
harnessRulesPath: config.harnessRulesPath,
|
|
22
|
+
additionalRulesPaths: config.additionalRulesPaths,
|
|
23
|
+
});
|
|
24
|
+
const store = getPolicyStore();
|
|
25
|
+
const toolClassifier = config.toolClassifier ?? classifyToolCall;
|
|
26
|
+
// Track if pi-lens is available
|
|
27
|
+
let piLensAvailable = false;
|
|
28
|
+
// Check for pi-lens availability on session start
|
|
29
|
+
pi.on("session_start", async (event) => {
|
|
30
|
+
// pi-lens registers its own tools, so we can check for them
|
|
31
|
+
const availableTools = event.availableTools ?? [];
|
|
32
|
+
piLensAvailable = availableTools.includes("lens_diagnostics");
|
|
33
|
+
});
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// before_agent_start: Inject system contract
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
pi.on("before_agent_start", async (event, ctx) => {
|
|
38
|
+
const cwd = getCwdFromContext(ctx);
|
|
39
|
+
try {
|
|
40
|
+
const manifest = await loader.load(cwd);
|
|
41
|
+
// Record delivery in store
|
|
42
|
+
const sessionId = getSessionIdFromCtx(ctx);
|
|
43
|
+
const receipt = store.noteDelivered(sessionId, manifest, "system_prompt");
|
|
44
|
+
// Render and inject contract
|
|
45
|
+
const contract = renderSystemContract(manifest);
|
|
46
|
+
// Build augmented system prompt
|
|
47
|
+
const augmentedPrompt = event.systemPrompt + "\n\n" + contract;
|
|
48
|
+
// Log for debugging
|
|
49
|
+
console.log(`[agent-policy] Delivered policy ${manifest.revision} to session ${receipt.sessionId}`);
|
|
50
|
+
return { systemPrompt: augmentedPrompt };
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
54
|
+
console.error(`[agent-policy] Failed to load policy: ${errorMessage}`);
|
|
55
|
+
// Return minimal contract on failure - don't block startup
|
|
56
|
+
const fallbackContract = `
|
|
57
|
+
PI-HARNESS POLICY coverage=degraded
|
|
58
|
+
|
|
59
|
+
WARNING: Policy loading failed. Please report this to your administrator.
|
|
60
|
+
Use harness_rules to check policy status.
|
|
61
|
+
`.trim();
|
|
62
|
+
return { systemPrompt: event.systemPrompt + "\n\n" + fallbackContract };
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// tool_call: Gate mutations until policy received
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
pi.on("tool_call", async (event, ctx) => {
|
|
69
|
+
const toolName = event.toolName;
|
|
70
|
+
const input = event.input;
|
|
71
|
+
const capability = toolClassifier(toolName, input);
|
|
72
|
+
// Skip non-mutating calls
|
|
73
|
+
if (!capability.mutatesProject && !capability.releasesProject && !capability.isChildDelegation) {
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
const cwd = getCwdFromContext(ctx);
|
|
77
|
+
const sessionId = getSessionIdFromCtx(ctx);
|
|
78
|
+
const targetPath = capability.affectedPaths?.[0];
|
|
79
|
+
try {
|
|
80
|
+
const manifest = await loader.loadForTarget(cwd, targetPath);
|
|
81
|
+
const receipt = store.getReceipt(sessionId, manifest.projectRoot);
|
|
82
|
+
// Check if current revision is covered
|
|
83
|
+
if (!receipt || receipt.revision !== manifest.revision) {
|
|
84
|
+
const blockReason = receipt
|
|
85
|
+
? `Policy revision changed (expected ${manifest.revision}, received ${receipt.revision})`
|
|
86
|
+
: `Policy revision ${manifest.revision} not yet delivered`;
|
|
87
|
+
console.log(`[agent-policy] Blocked ${toolName}: ${blockReason}`);
|
|
88
|
+
const reason = `[POLICY REQUIRED] ${blockReason}\n\n` +
|
|
89
|
+
`Call harness_rules action=read to load the current rules, then retry this operation.\n` +
|
|
90
|
+
`Or call harness_rules action=manifest to see the current policy status.`;
|
|
91
|
+
return { block: true, reason };
|
|
92
|
+
}
|
|
93
|
+
// Optional: Check git guard
|
|
94
|
+
if (config.gitGuardEnabled && capability.releasesProject) {
|
|
95
|
+
// Git operations are gated by pi-lens Git guard if available
|
|
96
|
+
const blockingFindings = await checkForBlockingFindings(ctx, piLensAvailable);
|
|
97
|
+
if (blockingFindings) {
|
|
98
|
+
return {
|
|
99
|
+
block: true,
|
|
100
|
+
reason: `[GIT GUARD] Blocking git operation until findings are resolved.\n\n${blockingFindings}`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Policy satisfied, allow the call
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
109
|
+
console.error(`[agent-policy] Policy check failed: ${errorMessage}`);
|
|
110
|
+
// On error, fail open for the command but log the issue
|
|
111
|
+
// This matches pi-lens's total handler guard behavior
|
|
112
|
+
return {};
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// harness_rules tool implementation
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
pi.registerTool({
|
|
119
|
+
name: "harness_rules",
|
|
120
|
+
label: "Harness Rules",
|
|
121
|
+
description: [
|
|
122
|
+
"Retrieve and acknowledge harness policy rules.",
|
|
123
|
+
"Actions:",
|
|
124
|
+
" - manifest: Show current policy status (revision, coverage, sources)",
|
|
125
|
+
" - read: Get full rule text (optionally filtered by source or section)",
|
|
126
|
+
" - acknowledge: Confirm receipt of a specific revision",
|
|
127
|
+
].join("\n"),
|
|
128
|
+
parameters: {
|
|
129
|
+
type: "object",
|
|
130
|
+
properties: {
|
|
131
|
+
action: {
|
|
132
|
+
type: "string",
|
|
133
|
+
enum: ["manifest", "read", "acknowledge"],
|
|
134
|
+
description: "Action to perform",
|
|
135
|
+
},
|
|
136
|
+
source: {
|
|
137
|
+
type: "string",
|
|
138
|
+
description: "Source path filter (partial match) for read action",
|
|
139
|
+
},
|
|
140
|
+
section: {
|
|
141
|
+
type: "string",
|
|
142
|
+
description: "Section title filter for read action",
|
|
143
|
+
},
|
|
144
|
+
revision: {
|
|
145
|
+
type: "string",
|
|
146
|
+
description: "Revision to acknowledge",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
required: ["action"],
|
|
150
|
+
},
|
|
151
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
152
|
+
const cwd = ctx.cwd;
|
|
153
|
+
const sessionId = getSessionIdFromCtx(ctx);
|
|
154
|
+
try {
|
|
155
|
+
const input = params;
|
|
156
|
+
switch (input.action) {
|
|
157
|
+
case "manifest": {
|
|
158
|
+
const manifest = await loader.load(cwd);
|
|
159
|
+
return {
|
|
160
|
+
content: [{
|
|
161
|
+
type: "text",
|
|
162
|
+
text: JSON.stringify({ manifest }, null, 2),
|
|
163
|
+
}],
|
|
164
|
+
details: { manifest },
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
case "read": {
|
|
168
|
+
const manifest = await loader.load(cwd);
|
|
169
|
+
const result = renderFullRules(manifest, {
|
|
170
|
+
source: input.source,
|
|
171
|
+
section: input.section,
|
|
172
|
+
});
|
|
173
|
+
// Record delivery if not already recorded
|
|
174
|
+
const existingReceipt = store.getReceipt(sessionId, manifest.projectRoot);
|
|
175
|
+
if (!existingReceipt || existingReceipt.revision !== manifest.revision) {
|
|
176
|
+
store.noteDelivered(sessionId, manifest, "tool", result.sections?.map(s => s.id) ?? ["*"]);
|
|
177
|
+
}
|
|
178
|
+
// Format output as readable text
|
|
179
|
+
let output = `Harness Policy Rules (revision: ${manifest.revision})\n`;
|
|
180
|
+
output += "=".repeat(50) + "\n\n";
|
|
181
|
+
if (result.sections) {
|
|
182
|
+
for (const section of result.sections) {
|
|
183
|
+
output += `[${section.priority.toUpperCase()}] ${section.title}\n`;
|
|
184
|
+
output += `Source: ${section.source}\n`;
|
|
185
|
+
if (section.truncated) {
|
|
186
|
+
output += "(truncated)\n";
|
|
187
|
+
}
|
|
188
|
+
output += "\n" + section.content + "\n\n";
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
content: [{
|
|
193
|
+
type: "text",
|
|
194
|
+
text: output,
|
|
195
|
+
}],
|
|
196
|
+
details: { sections: result.sections },
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
case "acknowledge": {
|
|
200
|
+
const manifest = await loader.load(cwd);
|
|
201
|
+
// Reject acknowledgement of wrong revision
|
|
202
|
+
if (input.revision && input.revision !== manifest.revision) {
|
|
203
|
+
return {
|
|
204
|
+
content: [{
|
|
205
|
+
type: "text",
|
|
206
|
+
text: `ERROR: Cannot acknowledge revision ${input.revision}: current revision is ${manifest.revision}`,
|
|
207
|
+
}],
|
|
208
|
+
isError: true,
|
|
209
|
+
details: { error: "revision_mismatch" },
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// Record acknowledgement
|
|
213
|
+
const receipt = store.noteDelivered(sessionId, manifest, "tool", ["*"] // Full content acknowledged
|
|
214
|
+
);
|
|
215
|
+
return {
|
|
216
|
+
content: [{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: `Policy acknowledged.\nRevision: ${receipt.revision}\nDelivered: ${new Date(receipt.deliveredAt).toISOString()}`,
|
|
219
|
+
}],
|
|
220
|
+
details: { receipt },
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
default: {
|
|
224
|
+
const unknownAction = input.action;
|
|
225
|
+
return {
|
|
226
|
+
content: [{
|
|
227
|
+
type: "text",
|
|
228
|
+
text: `ERROR: Unknown action: ${unknownAction}`,
|
|
229
|
+
}],
|
|
230
|
+
isError: true,
|
|
231
|
+
details: { error: "unknown_action" },
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
238
|
+
console.error(`[agent-policy] harness_rules failed: ${errorMessage}`);
|
|
239
|
+
return {
|
|
240
|
+
content: [{
|
|
241
|
+
type: "text",
|
|
242
|
+
text: `Policy operation failed: ${errorMessage}`,
|
|
243
|
+
}],
|
|
244
|
+
isError: true,
|
|
245
|
+
details: { error: errorMessage },
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
// session_start: Initialize session tracking
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
pi.on("session_start", (_event, ctx) => {
|
|
254
|
+
const sessionId = getSessionIdFromCtx(ctx);
|
|
255
|
+
const cwd = getCwdFromContext(ctx);
|
|
256
|
+
console.log(`[agent-policy] Session started: ${sessionId} in ${cwd}`);
|
|
257
|
+
});
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// agent_end: Cleanup
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
pi.on("agent_end", () => {
|
|
262
|
+
console.log("[agent-policy] Agent ended");
|
|
263
|
+
});
|
|
264
|
+
console.log("[agent-policy] Registered agent policy runtime");
|
|
265
|
+
}
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
// Helpers
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
/**
|
|
270
|
+
* Extract session ID from context.
|
|
271
|
+
*/
|
|
272
|
+
function getSessionIdFromCtx(ctx) {
|
|
273
|
+
const ctxObj = ctx;
|
|
274
|
+
if (typeof ctxObj?.sessionId === "string") {
|
|
275
|
+
return ctxObj.sessionId;
|
|
276
|
+
}
|
|
277
|
+
if (typeof ctxObj?.id === "string") {
|
|
278
|
+
return ctxObj.id;
|
|
279
|
+
}
|
|
280
|
+
// Fallback to a generated ID
|
|
281
|
+
return `session-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Extract working directory from context.
|
|
285
|
+
*/
|
|
286
|
+
function getCwdFromContext(ctx) {
|
|
287
|
+
const ctxObj = ctx;
|
|
288
|
+
if (typeof ctxObj?.cwd === "string") {
|
|
289
|
+
return ctxObj.cwd;
|
|
290
|
+
}
|
|
291
|
+
if (typeof ctxObj?.workingDirectory === "string") {
|
|
292
|
+
return ctxObj.workingDirectory;
|
|
293
|
+
}
|
|
294
|
+
// Fallback to process cwd
|
|
295
|
+
return process.cwd();
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Check for blocking findings (placeholder for pi-lens integration).
|
|
299
|
+
*/
|
|
300
|
+
async function checkForBlockingFindings(_ctx, piLensAvailable) {
|
|
301
|
+
if (!piLensAvailable) {
|
|
302
|
+
return null; // No blocking findings without pi-lens
|
|
303
|
+
}
|
|
304
|
+
// TODO: Query pi-lens for fresh blocking findings
|
|
305
|
+
// This would integrate with pi-lens's finding store
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
// ---------------------------------------------------------------------------
|
|
309
|
+
// Convenience Export
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
/**
|
|
312
|
+
* Register with default configuration pointing to harness AGENTS.md.
|
|
313
|
+
*/
|
|
314
|
+
export function registerDefault(pi) {
|
|
315
|
+
const harnessRulesPath = new URL("../../../AGENTS.md", import.meta.url);
|
|
316
|
+
registerAgentPolicy(pi, {
|
|
317
|
+
harnessRulesPath,
|
|
318
|
+
requireReceiptBeforeMutation: true,
|
|
319
|
+
lspMode: "pi-lens",
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +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;AAE9C,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;IAEjE,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,CAAC,CAAC;YAC3C,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,GAAG,CAAC,mCAAmC,QAAQ,CAAC,QAAQ,eAAe,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAEpG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,yCAAyC,YAAY,EAAE,CAAC,CAAC;YAEvE,2DAA2D;YAC3D,MAAM,gBAAgB,GAAG;;;;;CAK9B,CAAC,IAAI,EAAE,CAAC;YAEH,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,kDAAkD;IAClD,8EAA8E;IAE9E,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAoB,EAAE,GAAG,EAAE,EAAE;QACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEnD,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;YAC/F,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;YAElE,uCAAuC;YACvC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACvD,MAAM,WAAW,GAAG,OAAO;oBACzB,CAAC,CAAC,qCAAqC,QAAQ,CAAC,QAAQ,cAAc,OAAO,CAAC,QAAQ,GAAG;oBACzF,CAAC,CAAC,mBAAmB,QAAQ,CAAC,QAAQ,oBAAoB,CAAC;gBAE7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,KAAK,WAAW,EAAE,CAAC,CAAC;gBAElE,MAAM,MAAM,GAAG,qBAAqB,WAAW,MAAM;oBACnD,wFAAwF;oBACxF,yEAAyE,CAAC;gBAE5E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACjC,CAAC;YAED,4BAA4B;YAC5B,IAAI,MAAM,CAAC,eAAe,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;gBACzD,6DAA6D;gBAC7D,MAAM,gBAAgB,GAAG,MAAM,wBAAwB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;gBAC9E,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO;wBACL,KAAK,EAAE,IAAI;wBACX,MAAM,EAAE,sEAAsE,gBAAgB,EAAE;qBACjG,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,mCAAmC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;YAErE,wDAAwD;YACxD,sDAAsD;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,oCAAoC;IACpC,8EAA8E;IAE9E,EAAE,CAAC,YAAY,CAAC;QACd,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE;YACX,gDAAgD;YAChD,UAAU;YACV,wEAAwE;YACxE,yEAAyE;YACzE,yDAAyD;SAC1D,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC;oBACzC,WAAW,EAAE,mBAAmB;iBACjC;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yBAAyB;iBACvC;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACZ;QAEV,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG;YACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACpB,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAA2B,CAAC;gBAE1C,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;oBACrB,KAAK,UAAU,EAAE,CAAC;wBAChB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACxC,OAAO;4BACL,OAAO,EAAE,CAAC;oCACR,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iCAC5C,CAAC;4BACF,OAAO,EAAE,EAAE,QAAQ,EAAE;yBACtB,CAAC;oBACJ,CAAC;oBAED,KAAK,MAAM,EAAE,CAAC;wBACZ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACxC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE;4BACvC,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,OAAO,EAAE,KAAK,CAAC,OAAO;yBACvB,CAAC,CAAC;wBAEH,0CAA0C;wBAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;wBAC1E,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;4BACvE,KAAK,CAAC,aAAa,CACjB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACzC,CAAC;wBACJ,CAAC;wBAED,iCAAiC;wBACjC,IAAI,MAAM,GAAG,mCAAmC,QAAQ,CAAC,QAAQ,KAAK,CAAC;wBACvE,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;wBAElC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;4BACpB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gCACtC,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC;gCACnE,MAAM,IAAI,WAAW,OAAO,CAAC,MAAM,IAAI,CAAC;gCACxC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oCACtB,MAAM,IAAI,eAAe,CAAC;gCAC5B,CAAC;gCACD,MAAM,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;4BAC5C,CAAC;wBACH,CAAC;wBAED,OAAO;4BACL,OAAO,EAAE,CAAC;oCACR,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,MAAM;iCACb,CAAC;4BACF,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;yBACvC,CAAC;oBACJ,CAAC;oBAED,KAAK,aAAa,EAAE,CAAC;wBACnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAExC,2CAA2C;wBAC3C,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;4BAC3D,OAAO;gCACL,OAAO,EAAE,CAAC;wCACR,IAAI,EAAE,MAAe;wCACrB,IAAI,EAAE,sCAAsC,KAAK,CAAC,QAAQ,yBAAyB,QAAQ,CAAC,QAAQ,EAAE;qCACvG,CAAC;gCACF,OAAO,EAAE,IAAI;gCACb,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;6BACxC,CAAC;wBACJ,CAAC;wBAED,yBAAyB;wBACzB,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CACjC,SAAS,EACT,QAAQ,EACR,MAAM,EACN,CAAC,GAAG,CAAC,CAAC,4BAA4B;yBACnC,CAAC;wBAEF,OAAO;4BACL,OAAO,EAAE,CAAC;oCACR,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,mCAAmC,OAAO,CAAC,QAAQ,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE;iCACvH,CAAC;4BACF,OAAO,EAAE,EAAE,OAAO,EAAE;yBACrB,CAAC;oBACJ,CAAC;oBAED,SAAS,CAAC;wBACR,MAAM,aAAa,GAAI,KAA0B,CAAC,MAAM,CAAC;wBACzD,OAAO;4BACL,OAAO,EAAE,CAAC;oCACR,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE,0BAA0B,aAAa,EAAE;iCAChD,CAAC;4BACF,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;yBACrC,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtE,OAAO,CAAC,KAAK,CAAC,wCAAwC,YAAY,EAAE,CAAC,CAAC;gBACtE,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,4BAA4B,YAAY,EAAE;yBACjD,CAAC;oBACF,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;iBACjC,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,8EAA8E;IAC9E,6CAA6C;IAC7C,8EAA8E;IAE9E,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,MAAyB,EAAE,GAAY,EAAE,EAAE;QACjE,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,OAAO,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,qBAAqB;IACrB,8EAA8E;IAE9E,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,MAAM,MAAM,GAAG,GAA8B,CAAC;IAE9C,IAAI,OAAO,MAAM,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,MAAM,EAAE,EAAE,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC;IAED,6BAA6B;IAC7B,OAAO,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,MAAM,MAAM,GAAG,GAA8B,CAAC;IAE9C,IAAI,OAAO,MAAM,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,MAAM,EAAE,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED,0BAA0B;IAC1B,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,IAAa,EACb,eAAwB;IAExB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtD,CAAC;IAED,kDAAkD;IAClD,oDAAoD;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAgB;IAC9C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IAExE,mBAAmB,CAAC,EAAE,EAAE;QACtB,gBAAgB;QAChB,4BAA4B,EAAE,IAAI;QAClC,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Policy Package
|
|
3
|
+
*
|
|
4
|
+
* Provides mandatory policy delivery and mutation gating for pi-harness.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { registerAgentPolicy } from "@pi/agent-policy";
|
|
9
|
+
*
|
|
10
|
+
* export default function (pi: ExtensionAPI) {
|
|
11
|
+
* registerAgentPolicy(pi, {
|
|
12
|
+
* harnessRulesPath: new URL("./AGENTS.md", import.meta.url),
|
|
13
|
+
* requireReceiptBeforeMutation: true,
|
|
14
|
+
* lspMode: "pi-lens",
|
|
15
|
+
* });
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export type { AgentPolicyConfig, HarnessRulesInput, HarnessRulesOutput, MinimaxFindingEnvelope, PolicyFinding, PolicyManifest, PolicyReceipt, PolicySection, PolicySource, ToolCallCapability, HarnessAgentVerdict, } from "./types.js";
|
|
20
|
+
export { PolicyLoader, createPolicyLoader } from "./policy-loader.js";
|
|
21
|
+
export { PolicyStore, getPolicyStore, resetPolicyStore } from "./policy-store.js";
|
|
22
|
+
export { renderSystemContract, renderFullRules, renderManifestSummary, renderFindingEnvelope, parseSections, createCleanEnvelope, createDegradedEnvelope, } from "./policy-renderer.js";
|
|
23
|
+
export { registerAgentPolicy, registerDefault } from "./extension.js";
|
|
24
|
+
export { classifyToolCall } from "./types.js";
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Policy Package
|
|
3
|
+
*
|
|
4
|
+
* Provides mandatory policy delivery and mutation gating for pi-harness.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { registerAgentPolicy } from "@pi/agent-policy";
|
|
9
|
+
*
|
|
10
|
+
* export default function (pi: ExtensionAPI) {
|
|
11
|
+
* registerAgentPolicy(pi, {
|
|
12
|
+
* harnessRulesPath: new URL("./AGENTS.md", import.meta.url),
|
|
13
|
+
* requireReceiptBeforeMutation: true,
|
|
14
|
+
* lspMode: "pi-lens",
|
|
15
|
+
* });
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
// Policy Components
|
|
20
|
+
export { PolicyLoader, createPolicyLoader } from "./policy-loader.js";
|
|
21
|
+
export { PolicyStore, getPolicyStore, resetPolicyStore } from "./policy-store.js";
|
|
22
|
+
export { renderSystemContract, renderFullRules, renderManifestSummary, renderFindingEnvelope, parseSections, createCleanEnvelope, createDegradedEnvelope, } from "./policy-renderer.js";
|
|
23
|
+
// Extension Registration
|
|
24
|
+
export { registerAgentPolicy, registerDefault } from "./extension.js";
|
|
25
|
+
// Tool Classifier
|
|
26
|
+
export { classifyToolCall } from "./types.js";
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAiBH,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,yBAAyB;AACzB,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtE,kBAAkB;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|