pi-harness-runtime 1.1.381 → 1.1.383
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +133 -13
- 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/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/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 +174 -9
- package/packages/jev-judge/dist/continuation-controller.d.ts.map +1 -1
- package/packages/jev-judge/dist/continuation-controller.js +530 -77
- package/packages/jev-judge/dist/continuation-controller.js.map +1 -1
- package/packages/jev-judge/dist/typesafe-provider.d.ts.map +1 -1
- package/packages/jev-judge/dist/typesafe-provider.js +29 -2
- package/packages/jev-judge/dist/typesafe-provider.js.map +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/jev-judge/src/continuation-controller.ts +636 -83
- package/packages/jev-judge/src/typesafe-provider.ts +31 -2
- package/packages/jev-judge/tests/continuation-controller.test.ts +1229 -0
- package/packages/jev-judge/tests/typesafe-provider.test.ts +180 -0
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -1
- package/packages/notification/dist/adapters/telegram-adapter.js +37 -4
- package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/notification/src/adapters/telegram-adapter.ts +45 -4
- 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/dist/client.d.ts +36 -1
- package/packages/relay/dist/client.js +195 -25
- package/packages/relay/dist/server.d.ts +5 -1
- package/packages/relay/dist/server.js +74 -7
- package/packages/relay/dist/types.d.ts +7 -0
- package/packages/relay/package.json +1 -1
- package/packages/relay/src/client.ts +206 -42
- package/packages/relay/src/server.ts +78 -10
- package/packages/relay/src/types.ts +7 -0
- package/packages/relay/test/client.test.ts +312 -0
- package/packages/relay/test/relay-e2e.test.ts +263 -0
- 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/dist/harness-footer.d.ts +131 -0
- package/packages/tui/dist/harness-footer.d.ts.map +1 -0
- package/packages/tui/dist/harness-footer.js +463 -0
- package/packages/tui/dist/harness-footer.js.map +1 -0
- package/packages/tui/dist/index.d.ts +1 -0
- package/packages/tui/dist/index.d.ts.map +1 -1
- package/packages/tui/dist/index.js +1 -0
- package/packages/tui/dist/index.js.map +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/tui/src/harness-footer.ts +580 -0
- package/packages/tui/src/index.ts +17 -0
- package/packages/tui/test/harness-footer.test.ts +440 -0
- 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 +70 -13
package/index.ts
CHANGED
|
@@ -660,6 +660,9 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
660
660
|
|
|
661
661
|
// Clean up controller on session shutdown
|
|
662
662
|
pi.on("session_shutdown", () => {
|
|
663
|
+
// Release the guard timer and the queue: a stopped session must not
|
|
664
|
+
// keep a timer alive nor block a later continuation.
|
|
665
|
+
todoContinuationController?.dispose?.();
|
|
663
666
|
todoContinuationController = null;
|
|
664
667
|
});
|
|
665
668
|
|
|
@@ -830,6 +833,12 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
830
833
|
|
|
831
834
|
// --- agent_settled: Check todos and continue work ---------------
|
|
832
835
|
pi.on("agent_settled", async (_event, ctx) => {
|
|
836
|
+
// The turn that a previous continuation triggered has now settled:
|
|
837
|
+
// release the dispatch guard so the next decision can dispatch again.
|
|
838
|
+
// Keeping it set would block every later dispatch while still
|
|
839
|
+
// consuming the retry budget.
|
|
840
|
+
todoContinuationController?.releaseContinuationGuard?.("agent_settled");
|
|
841
|
+
|
|
833
842
|
// Don't continue if user is waiting for response
|
|
834
843
|
if (waitingForUserSince) {
|
|
835
844
|
todoContinuationController?.clearQueue();
|
|
@@ -857,8 +866,19 @@ async function initAutoContinue(pi: ExtensionAPI): Promise<void> {
|
|
|
857
866
|
|
|
858
867
|
if (result.action === "continue" && result.nextItemId) {
|
|
859
868
|
updateAutoContinueStatus("CONTINUING");
|
|
860
|
-
await todoContinuationController.steerToContinue(result.nextItemId);
|
|
861
|
-
|
|
869
|
+
const steer = await todoContinuationController.steerToContinue(result.nextItemId);
|
|
870
|
+
if (!steer?.dispatched) {
|
|
871
|
+
// Surface an explicit stall reason instead of silently doing nothing
|
|
872
|
+
logToFile(
|
|
873
|
+
"[auto-continue]",
|
|
874
|
+
"Continuation not dispatched:",
|
|
875
|
+
steer?.reason ?? "unknown reason",
|
|
876
|
+
`(attempts=${steer?.attempts ?? 0}, blocked=${steer?.blockedDispatches ?? 0})`,
|
|
877
|
+
);
|
|
878
|
+
updateAutoContinueStatus("IDLE");
|
|
879
|
+
}
|
|
880
|
+
// Guard stays set while the agent processes the continuation and is
|
|
881
|
+
// released by releaseContinuationGuard() on the next agent_settled.
|
|
862
882
|
} else {
|
|
863
883
|
// Not continuing - clear queue to allow future decisions
|
|
864
884
|
todoContinuationController.clearQueue();
|
|
@@ -1242,7 +1262,11 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
1242
1262
|
enabled: true,
|
|
1243
1263
|
config: { channelAccessToken: lineAccessToken, userId: lineUserId },
|
|
1244
1264
|
});
|
|
1245
|
-
addHarnessMessage("LINE", "configured and enabled", "ok");
|
|
1265
|
+
addHarnessMessage("LINE", "configured and enabled (tap Toggle LINE to disable)", "ok");
|
|
1266
|
+
} else {
|
|
1267
|
+
addHarnessMessage("LINE", "not configured", "warn", [
|
|
1268
|
+
"Configure LINE in ~/.pi-harness-runtime/keys/",
|
|
1269
|
+
]);
|
|
1246
1270
|
}
|
|
1247
1271
|
|
|
1248
1272
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -1451,7 +1475,7 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
1451
1475
|
const botUsername = center.getTelegramBotUsername();
|
|
1452
1476
|
const telegram = center.getTelegramAdapter();
|
|
1453
1477
|
telegram?.setGreetingVerifiedHandler(() => {
|
|
1454
|
-
addHarnessMessage("Telegram", "ready (
|
|
1478
|
+
addHarnessMessage("Telegram", "ready (tap Toggle Telegram to disable)", "ok");
|
|
1455
1479
|
});
|
|
1456
1480
|
|
|
1457
1481
|
// Set adapter for relay streaming (receives callbacks via WebSocket)
|
|
@@ -1462,18 +1486,14 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
1462
1486
|
_relayClient?.disconnect();
|
|
1463
1487
|
});
|
|
1464
1488
|
|
|
1465
|
-
// Check if webhook mode is configured
|
|
1466
|
-
const homedir2 = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
|
|
1467
|
-
const webhookUrlPath = join(homedir2, ".pi-harness-runtime", "keys", "telegram-webhook-url.txt");
|
|
1468
|
-
const _hasWebhook = existsSync(webhookUrlPath);
|
|
1469
|
-
|
|
1470
1489
|
// Initialize relay streaming (receives callbacks via WebSocket)
|
|
1471
1490
|
// In webhook mode, streaming delivers callbacks in real-time
|
|
1472
1491
|
await initRelayStream();
|
|
1473
1492
|
|
|
1474
1493
|
const greeting = await telegram?.sendStartupGreeting();
|
|
1494
|
+
logStartup(`[pi-harness] Telegram greeting result: ${JSON.stringify(greeting)}`);
|
|
1475
1495
|
if (!greeting?.success) {
|
|
1476
|
-
logStartup("[pi-harness] Telegram: startup greeting delivery failed");
|
|
1496
|
+
logStartup("[pi-harness] Telegram: startup greeting delivery failed - see logs");
|
|
1477
1497
|
addHarnessMessage("Telegram", "bot verified; Hi delivery failed", "err", [
|
|
1478
1498
|
"Open your bot in Telegram and press Start; unblock it if necessary.",
|
|
1479
1499
|
"Verify telegram-chat-id.txt in ~/.pi-harness-runtime/keys/ and network access, then reload Pi.",
|
|
@@ -1482,7 +1502,7 @@ async function initTelegram(pi: ExtensionAPI): Promise<void> {
|
|
|
1482
1502
|
}
|
|
1483
1503
|
telegram?.startPolling();
|
|
1484
1504
|
if (!telegram?.isGreetingVerified()) {
|
|
1485
|
-
addHarnessMessage("Telegram", "Hi sent; tap Say Hi
|
|
1505
|
+
addHarnessMessage("Telegram", "Hi sent; tap Say Hi to verify inbound (tap Toggle Telegram to disable)", "wait");
|
|
1486
1506
|
}
|
|
1487
1507
|
if (botUsername) {
|
|
1488
1508
|
logStartup(`[pi-harness] Telegram (@${botUsername}) ready — DM the bot to receive alerts`);
|
|
@@ -1547,6 +1567,9 @@ async function initRelayStream(): Promise<void> {
|
|
|
1547
1567
|
{
|
|
1548
1568
|
serverUrl: relayWsUrl,
|
|
1549
1569
|
token: relayToken,
|
|
1570
|
+
// Keep retrying in the background: the relay server may not be up
|
|
1571
|
+
// yet when the harness starts.
|
|
1572
|
+
retryOnConnectFailure: true,
|
|
1550
1573
|
},
|
|
1551
1574
|
{
|
|
1552
1575
|
onConnected: (sessionId) => {
|
|
@@ -3664,6 +3687,49 @@ Run \`bd ready\` to see current bd issues.
|
|
|
3664
3687
|
// Store only the setStatus function, NOT the ctx itself.
|
|
3665
3688
|
// Storing ctx causes stale-context errors after pi reload/restart.
|
|
3666
3689
|
let footerSetStatus: ((key: string, value: string) => void) | null = null;
|
|
3690
|
+
// The custom footer needs live session data (cwd, model, usage, context).
|
|
3691
|
+
// The ctx is stored here as well, but the footer guards every access and
|
|
3692
|
+
// keeps the last known values when the ctx has gone stale, so a replaced
|
|
3693
|
+
// session can never break the rendering.
|
|
3694
|
+
let latestFooterCtx: ExtensionContext | null = null;
|
|
3695
|
+
let harnessFooterEnabled = true;
|
|
3696
|
+
|
|
3697
|
+
/**
|
|
3698
|
+
* Install the harness footer.
|
|
3699
|
+
*
|
|
3700
|
+
* Pi's built-in footer renders ALL `setStatus()` values on ONE shared line,
|
|
3701
|
+
* so the quota and the workspace environment summary used to be appended to
|
|
3702
|
+
* each other (and the workspace summary was truncated away on narrow
|
|
3703
|
+
* terminals). The harness footer gives the workspace summary its own row
|
|
3704
|
+
* while keeping Pi's footer information (cwd/branch, token stats, cost,
|
|
3705
|
+
* context usage, model/thinking state, other extensions' statuses).
|
|
3706
|
+
*
|
|
3707
|
+
* This function never rejects: every access to the (possibly stale) ctx is
|
|
3708
|
+
* guarded and failures are logged.
|
|
3709
|
+
*/
|
|
3710
|
+
async function installHarnessFooter(ctx: ExtensionContext): Promise<void> {
|
|
3711
|
+
try {
|
|
3712
|
+
if (!harnessFooterEnabled) return;
|
|
3713
|
+
// A stale ctx throws on property access - read it defensively.
|
|
3714
|
+
let mode: string | undefined;
|
|
3715
|
+
try {
|
|
3716
|
+
mode = ctx.mode;
|
|
3717
|
+
} catch {
|
|
3718
|
+
mode = undefined;
|
|
3719
|
+
}
|
|
3720
|
+
if (mode !== "tui") return;
|
|
3721
|
+
const { createHarnessFooter } = await import(
|
|
3722
|
+
"./packages/tui/src/harness-footer.js"
|
|
3723
|
+
);
|
|
3724
|
+
ctx.ui.setFooter((tui, theme, footerData) =>
|
|
3725
|
+
createHarnessFooter(tui, theme, footerData, {
|
|
3726
|
+
getContext: () => latestFooterCtx,
|
|
3727
|
+
}),
|
|
3728
|
+
);
|
|
3729
|
+
} catch (e) {
|
|
3730
|
+
logToFile("[pi-harness] harness footer install failed:", String(e));
|
|
3731
|
+
}
|
|
3732
|
+
}
|
|
3667
3733
|
let quotaAutoFetchInFlight = false;
|
|
3668
3734
|
let proactiveCompactInFlight = false;
|
|
3669
3735
|
let lastProactiveCompactAt = 0;
|
|
@@ -4577,6 +4643,49 @@ Run \`bd ready\` to see current bd issues.
|
|
|
4577
4643
|
},
|
|
4578
4644
|
});
|
|
4579
4645
|
|
|
4646
|
+
// --- /harness-footer — Toggle harness custom footer vs built-in Pi footer ----
|
|
4647
|
+
pi.registerCommand("harness-footer", {
|
|
4648
|
+
description: "Toggle or restore footer: /harness-footer [harness|builtin]",
|
|
4649
|
+
handler: async (args: string, ctx: ExtensionCommandContext) => {
|
|
4650
|
+
// A stale ctx throws on property access - read it defensively.
|
|
4651
|
+
let ctxMode: string | undefined;
|
|
4652
|
+
try {
|
|
4653
|
+
ctxMode = ctx.mode;
|
|
4654
|
+
} catch {
|
|
4655
|
+
ctxMode = undefined;
|
|
4656
|
+
}
|
|
4657
|
+
if (ctxMode !== "tui") {
|
|
4658
|
+
ctx.ui.notify("Footer control is only available in TUI mode.", "info");
|
|
4659
|
+
return;
|
|
4660
|
+
}
|
|
4661
|
+
|
|
4662
|
+
const mode = args.trim().toLowerCase();
|
|
4663
|
+
if (mode === "builtin" || mode === "pi") {
|
|
4664
|
+
harnessFooterEnabled = false;
|
|
4665
|
+
ctx.ui.setFooter(undefined);
|
|
4666
|
+
ctx.ui.notify(
|
|
4667
|
+
"Built-in Pi footer restored. The workspace summary shares the status line again.",
|
|
4668
|
+
"info",
|
|
4669
|
+
);
|
|
4670
|
+
} else if (mode === "harness" || mode === "") {
|
|
4671
|
+
harnessFooterEnabled = true;
|
|
4672
|
+
latestFooterCtx = ctx;
|
|
4673
|
+
await installHarnessFooter(ctx);
|
|
4674
|
+
ctx.ui.notify(
|
|
4675
|
+
"Harness custom footer installed. The workspace summary has its own row.",
|
|
4676
|
+
"info",
|
|
4677
|
+
);
|
|
4678
|
+
} else {
|
|
4679
|
+
ctx.ui.notify(
|
|
4680
|
+
"Usage: /harness-footer [harness|builtin]\n" +
|
|
4681
|
+
" harness — install the Harness footer (workspace summary on its own row)\n" +
|
|
4682
|
+
" builtin — restore Pi's built-in footer",
|
|
4683
|
+
"info",
|
|
4684
|
+
);
|
|
4685
|
+
}
|
|
4686
|
+
},
|
|
4687
|
+
});
|
|
4688
|
+
|
|
4580
4689
|
// --- Harness widget state (like Todos extension) -----------------------
|
|
4581
4690
|
// Learn from Todos extension:
|
|
4582
4691
|
// - setWidget with placement: "aboveEditor" (fixed above input)
|
|
@@ -4652,6 +4761,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
4652
4761
|
|
|
4653
4762
|
// Capture only the setStatus function, not the ctx
|
|
4654
4763
|
footerSetStatus = ctx.ui.setStatus.bind(ctx.ui);
|
|
4764
|
+
latestFooterCtx = ctx;
|
|
4655
4765
|
refreshFooterStatus(
|
|
4656
4766
|
footerSetStatus,
|
|
4657
4767
|
tracker,
|
|
@@ -4660,6 +4770,9 @@ Run \`bd ready\` to see current bd issues.
|
|
|
4660
4770
|
() => lastActiveProvider,
|
|
4661
4771
|
);
|
|
4662
4772
|
|
|
4773
|
+
// Give the workspace environment summary its own footer row
|
|
4774
|
+
void installHarnessFooter(ctx);
|
|
4775
|
+
|
|
4663
4776
|
// Increment session generation to fence late callbacks
|
|
4664
4777
|
sessionGeneration++;
|
|
4665
4778
|
const mySession = sessionGeneration;
|
|
@@ -4722,6 +4835,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
4722
4835
|
noteActiveProvider(ctx.model?.id ?? null);
|
|
4723
4836
|
// Capture only the setStatus function, not the ctx
|
|
4724
4837
|
footerSetStatus = ctx.ui.setStatus.bind(ctx.ui);
|
|
4838
|
+
latestFooterCtx = ctx;
|
|
4725
4839
|
refreshFooterStatus(
|
|
4726
4840
|
footerSetStatus,
|
|
4727
4841
|
tracker,
|
|
@@ -4751,6 +4865,7 @@ Run \`bd ready\` to see current bd issues.
|
|
|
4751
4865
|
pi.on("session_compact", async (event, ctx) => {
|
|
4752
4866
|
// Capture only the setStatus function, not the ctx
|
|
4753
4867
|
footerSetStatus = ctx.ui.setStatus.bind(ctx.ui);
|
|
4868
|
+
latestFooterCtx = ctx;
|
|
4754
4869
|
proactiveCompactInFlight = false;
|
|
4755
4870
|
lastProactiveCompactAt = Date.now();
|
|
4756
4871
|
consecutiveCompactFailures = 0;
|
|
@@ -4931,13 +5046,18 @@ function refreshFooterStatus(
|
|
|
4931
5046
|
statusValue,
|
|
4932
5047
|
);
|
|
4933
5048
|
|
|
4934
|
-
//
|
|
5049
|
+
// The workspace environment summary is published under its own status key.
|
|
5050
|
+
// Pi renders every status value on ONE shared line, so the harness footer
|
|
5051
|
+
// (see installHarnessFooter) renders it on a dedicated row instead.
|
|
4935
5052
|
setWorkspaceEnvStatus(setStatus);
|
|
4936
5053
|
}
|
|
4937
5054
|
|
|
4938
5055
|
/**
|
|
4939
5056
|
* Set workspace environment status line
|
|
4940
|
-
*
|
|
5057
|
+
*
|
|
5058
|
+
* Published under the `harness-workspace` status key. The harness footer
|
|
5059
|
+
* renders it on its own row (Pi's built-in footer joins all status values
|
|
5060
|
+
* into a single line).
|
|
4941
5061
|
*/
|
|
4942
5062
|
async function setWorkspaceEnvStatus(setStatus: (key: string, value: string) => void) {
|
|
4943
5063
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/capability-registry",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.383",
|
|
4
4
|
"description": "Capability Registry for pi-harness-runtime — tracks model capabilities and enables capability-based routing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|