pi-harness-runtime 1.1.404 → 1.1.405

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.
Files changed (158) hide show
  1. package/index.ts +275 -1
  2. package/package.json +1 -1
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/agent-policy/package.json +1 -1
  5. package/packages/architecture-generator/package.json +1 -1
  6. package/packages/auth/package.json +1 -1
  7. package/packages/autonomous-refactor/package.json +1 -1
  8. package/packages/autonomous-runtime/package.json +1 -1
  9. package/packages/cache-strategy/package.json +1 -1
  10. package/packages/capability-registry/package.json +1 -1
  11. package/packages/checkpoint/package.json +1 -1
  12. package/packages/cli-plugin-sdk/package.json +1 -1
  13. package/packages/clipboard/package.json +1 -1
  14. package/packages/clipboard-plugin/package.json +1 -1
  15. package/packages/code-generation/package.json +1 -1
  16. package/packages/code-review/package.json +1 -1
  17. package/packages/codex-adapter/package.json +1 -1
  18. package/packages/codex-watcher/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/connection-runtime/package.json +1 -1
  21. package/packages/context-compiler/package.json +1 -1
  22. package/packages/context-discovery/package.json +1 -1
  23. package/packages/context-manager/package.json +1 -1
  24. package/packages/contracts/package.json +1 -1
  25. package/packages/cookie-sanitizer/package.json +1 -1
  26. package/packages/cost-optimizer/package.json +1 -1
  27. package/packages/dependency-analyzer/package.json +1 -1
  28. package/packages/django-plugin/package.json +1 -1
  29. package/packages/doc-generator/package.json +1 -1
  30. package/packages/durable-review/package.json +1 -1
  31. package/packages/e2e-tester/package.json +1 -1
  32. package/packages/evaluation-engine/package.json +1 -1
  33. package/packages/evaluation-runner/package.json +1 -1
  34. package/packages/event-bus/package.json +1 -1
  35. package/packages/event-sink/package.json +1 -1
  36. package/packages/event-store/package.json +1 -1
  37. package/packages/experience-replay/package.json +1 -1
  38. package/packages/feedback-collector/package.json +1 -1
  39. package/packages/file-copy-helper/package.json +1 -1
  40. package/packages/framework-detector/package.json +1 -1
  41. package/packages/framework-plugin-sdk/package.json +1 -1
  42. package/packages/frappe-plugin/package.json +1 -1
  43. package/packages/generic-web-plugin/package.json +1 -1
  44. package/packages/health-monitor/package.json +1 -1
  45. package/packages/intent-analyzer/package.json +1 -1
  46. package/packages/jev-judge/package.json +1 -1
  47. package/packages/knowledge-graph/package.json +1 -1
  48. package/packages/knowledge-retrieval/package.json +1 -1
  49. package/packages/laravel-plugin/package.json +1 -1
  50. package/packages/learning-engine/package.json +1 -1
  51. package/packages/logging/package.json +1 -1
  52. package/packages/mcp-adapter/package.json +1 -1
  53. package/packages/memory-engine/package.json +1 -1
  54. package/packages/milestone-manager/package.json +1 -1
  55. package/packages/model-registry/package.json +1 -1
  56. package/packages/nextjs-plugin/package.json +1 -1
  57. package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -1
  58. package/packages/notification/dist/adapters/line-adapter.js +6 -1
  59. package/packages/notification/dist/adapters/line-adapter.js.map +1 -1
  60. package/packages/notification/dist/notification-center.d.ts.map +1 -1
  61. package/packages/notification/dist/notification-center.js +32 -0
  62. package/packages/notification/dist/notification-center.js.map +1 -1
  63. package/packages/notification/dist/telegram-webhook-handler.d.ts +7 -0
  64. package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -1
  65. package/packages/notification/dist/telegram-webhook-handler.js +7 -0
  66. package/packages/notification/dist/telegram-webhook-handler.js.map +1 -1
  67. package/packages/notification/dist/types.d.ts +1 -1
  68. package/packages/notification/dist/types.d.ts.map +1 -1
  69. package/packages/notification/package.json +1 -1
  70. package/packages/notification/src/adapters/line-adapter.ts +7 -1
  71. package/packages/notification/src/notification-center.ts +30 -0
  72. package/packages/notification/src/telegram-webhook-handler.ts +7 -0
  73. package/packages/notification/src/types.ts +1 -0
  74. package/packages/notification/test/notification.test.ts +31 -28
  75. package/packages/notification/test/tooling-proposal-payload.test.ts +212 -0
  76. package/packages/observability/package.json +1 -1
  77. package/packages/okf-indexer/package.json +1 -1
  78. package/packages/paperclip-integration/package.json +1 -1
  79. package/packages/performance-optimizer/package.json +1 -1
  80. package/packages/permission-mode/package.json +1 -1
  81. package/packages/privilege-broker/package.json +1 -1
  82. package/packages/project-analyzer/package.json +1 -1
  83. package/packages/project-bootstrap/package.json +1 -1
  84. package/packages/projection-engine/package.json +1 -1
  85. package/packages/prompt-compiler/package.json +1 -1
  86. package/packages/prompt-versioning/package.json +1 -1
  87. package/packages/provider-adapter-sdk/package.json +1 -1
  88. package/packages/provider-router/package.json +1 -1
  89. package/packages/provider-selector/package.json +1 -1
  90. package/packages/providers/package.json +1 -1
  91. package/packages/qdrant-skills/package.json +1 -1
  92. package/packages/quota-manager/package.json +1 -1
  93. package/packages/rate-limiter/package.json +1 -1
  94. package/packages/react-vite-plugin/package.json +1 -1
  95. package/packages/relay/package.json +1 -1
  96. package/packages/release-manager/package.json +1 -1
  97. package/packages/requirement-compiler/package.json +1 -1
  98. package/packages/runtime/package.json +1 -1
  99. package/packages/scheduler/package.json +1 -1
  100. package/packages/scheduler-adapter/package.json +1 -1
  101. package/packages/session/package.json +1 -1
  102. package/packages/session-api/package.json +1 -1
  103. package/packages/session-export/package.json +1 -1
  104. package/packages/shared-context/package.json +1 -1
  105. package/packages/skill-mcp-client/package.json +1 -1
  106. package/packages/skill-registry/package.json +1 -1
  107. package/packages/skills/package.json +1 -1
  108. package/packages/sprint-planner/package.json +1 -1
  109. package/packages/subscription-engine/package.json +1 -1
  110. package/packages/task-compiler/package.json +1 -1
  111. package/packages/telegram/package.json +1 -1
  112. package/packages/tencentdb-memory/package.json +1 -1
  113. package/packages/tencentdb-sync/package.json +1 -1
  114. package/packages/test-data-generator/package.json +1 -1
  115. package/packages/test-generator/package.json +1 -1
  116. package/packages/todo-bd-sync/package.json +1 -1
  117. package/packages/token-estimation/package.json +1 -1
  118. package/packages/token-optimizer/package.json +1 -1
  119. package/packages/tooling-preference/dist/detect.d.ts +62 -0
  120. package/packages/tooling-preference/dist/detect.d.ts.map +1 -0
  121. package/packages/tooling-preference/dist/detect.js +209 -0
  122. package/packages/tooling-preference/dist/detect.js.map +1 -0
  123. package/packages/tooling-preference/dist/index.d.ts +13 -0
  124. package/packages/tooling-preference/dist/index.d.ts.map +1 -0
  125. package/packages/tooling-preference/dist/index.js +13 -0
  126. package/packages/tooling-preference/dist/index.js.map +1 -0
  127. package/packages/tooling-preference/dist/proposal.d.ts +70 -0
  128. package/packages/tooling-preference/dist/proposal.d.ts.map +1 -0
  129. package/packages/tooling-preference/dist/proposal.js +137 -0
  130. package/packages/tooling-preference/dist/proposal.js.map +1 -0
  131. package/packages/tooling-preference/dist/registry.d.ts +50 -0
  132. package/packages/tooling-preference/dist/registry.d.ts.map +1 -0
  133. package/packages/tooling-preference/dist/registry.js +53 -0
  134. package/packages/tooling-preference/dist/registry.js.map +1 -0
  135. package/packages/tooling-preference/dist/store.d.ts +61 -0
  136. package/packages/tooling-preference/dist/store.d.ts.map +1 -0
  137. package/packages/tooling-preference/dist/store.js +129 -0
  138. package/packages/tooling-preference/dist/store.js.map +1 -0
  139. package/packages/tooling-preference/package.json +21 -0
  140. package/packages/tooling-preference/src/detect.ts +251 -0
  141. package/packages/tooling-preference/src/index.ts +44 -0
  142. package/packages/tooling-preference/src/proposal.ts +173 -0
  143. package/packages/tooling-preference/src/registry.ts +79 -0
  144. package/packages/tooling-preference/src/store.ts +162 -0
  145. package/packages/tooling-preference/tests/detect.test.ts +188 -0
  146. package/packages/tooling-preference/tests/proposal.test.ts +107 -0
  147. package/packages/tooling-preference/tests/registry.test.ts +51 -0
  148. package/packages/tooling-preference/tests/store.test.ts +99 -0
  149. package/packages/trajectory/package.json +1 -1
  150. package/packages/tui/package.json +1 -1
  151. package/packages/types/package.json +1 -1
  152. package/packages/voice-api/package.json +1 -1
  153. package/packages/webmcp-tester/package.json +1 -1
  154. package/packages/wiki/package.json +1 -1
  155. package/packages/workflow-events/package.json +1 -1
  156. package/packages/workspace-scanner/package.json +1 -1
  157. package/packages/worktree/package.json +1 -1
  158. package/packages/write-review/package.json +1 -1
@@ -11,44 +11,47 @@ const mockSend = vi.fn();
11
11
  const mockInitialize = vi.fn().mockResolvedValue(true);
12
12
  const mockIsConfigured = vi.fn().mockReturnValue(true);
13
13
 
14
+ // The mocks are classes, not mock functions: the notification center checks
15
+ // the adapter with "instanceof", and a mocked constructor makes that check
16
+ // throw for every test file that is loaded after this one.
14
17
  vi.mock("../src/adapters/telegram-adapter.js", () => ({
15
- TelegramAdapter: vi.fn().mockImplementation(() => ({
16
- send: mockSend,
17
- initialize: mockInitialize,
18
- isConfigured: mockIsConfigured,
19
- id: "telegram",
20
- type: "telegram",
21
- })),
18
+ TelegramAdapter: class {
19
+ id = "telegram";
20
+ type = "telegram";
21
+ send = mockSend;
22
+ initialize = mockInitialize;
23
+ isConfigured = mockIsConfigured;
24
+ },
22
25
  }));
23
26
 
24
27
  vi.mock("../src/adapters/ntfy-adapter.js", () => ({
25
- NtfyAdapter: vi.fn().mockImplementation(() => ({
26
- send: mockSend,
27
- initialize: mockInitialize,
28
- isConfigured: mockIsConfigured,
29
- id: "ntfy",
30
- type: "ntfy",
31
- })),
28
+ NtfyAdapter: class {
29
+ id = "ntfy";
30
+ type = "ntfy";
31
+ send = mockSend;
32
+ initialize = mockInitialize;
33
+ isConfigured = mockIsConfigured;
34
+ },
32
35
  }));
33
36
 
34
37
  vi.mock("../src/adapters/email-adapter.js", () => ({
35
- EmailAdapter: vi.fn().mockImplementation(() => ({
36
- send: mockSend,
37
- initialize: mockInitialize,
38
- isConfigured: mockIsConfigured,
39
- id: "email",
40
- type: "email",
41
- })),
38
+ EmailAdapter: class {
39
+ id = "email";
40
+ type = "email";
41
+ send = mockSend;
42
+ initialize = mockInitialize;
43
+ isConfigured = mockIsConfigured;
44
+ },
42
45
  }));
43
46
 
44
47
  vi.mock("../src/adapters/webhook-adapter.js", () => ({
45
- WebhookAdapter: vi.fn().mockImplementation(() => ({
46
- send: mockSend,
47
- initialize: mockInitialize,
48
- isConfigured: mockIsConfigured,
49
- id: "webhook",
50
- type: "webhook",
51
- })),
48
+ WebhookAdapter: class {
49
+ id = "webhook";
50
+ type = "webhook";
51
+ send = mockSend;
52
+ initialize = mockInitialize;
53
+ isConfigured = mockIsConfigured;
54
+ },
52
55
  }));
53
56
 
54
57
  describe("NotificationCenter", () => {
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Tooling proposal payload tests.
3
+ *
4
+ * The proposal (Biome.js instead of ESLint/Prettier) is a decision of its
5
+ * own. Its buttons carry the tooling action, never the approval action:
6
+ * a "No" on a proposal must not pause the work, and a "Yes" must not
7
+ * resume a pending question.
8
+ */
9
+
10
+ import { describe, it, expect, beforeEach, afterEach } from "bun:test";
11
+ import { NotificationCenter } from "../src/notification-center.js";
12
+ import { parseCallbackData } from "../src/telegram-webhook-handler.js";
13
+ import type { NotificationConfig } from "../src/types.js";
14
+
15
+ const PROPOSAL =
16
+ "This workspace looks like a Next.js + React project that still uses ESLint and Prettier. " +
17
+ "Biome.js can replace both: one tool for linting, formatting and import order.";
18
+
19
+ interface CapturedRequest {
20
+ url: string;
21
+ body: Record<string, any>;
22
+ }
23
+
24
+ let captured: CapturedRequest[] = [];
25
+ let originalFetch: typeof globalThis.fetch;
26
+
27
+ function createCenter(): NotificationCenter {
28
+ const config: NotificationConfig = {
29
+ channels: [
30
+ {
31
+ id: "telegram",
32
+ type: "telegram",
33
+ enabled: true,
34
+ config: {
35
+ botToken: "test-bot-token",
36
+ chatId: "12345",
37
+ enableInlineKeyboard: true,
38
+ },
39
+ },
40
+ {
41
+ id: "line",
42
+ type: "line",
43
+ enabled: true,
44
+ config: { channelAccessToken: "test-line-token", userId: "U-test" },
45
+ },
46
+ ],
47
+ };
48
+ return new NotificationCenter(config);
49
+ }
50
+
51
+ function lineRequests(): CapturedRequest[] {
52
+ return captured.filter((r) => r.url.includes("api.line.me"));
53
+ }
54
+
55
+ /**
56
+ * Capture the payload the Telegram adapter is asked to send.
57
+ *
58
+ * The adapter is replaced instead of the network, so the test does not
59
+ * depend on which adapter implementation is loaded.
60
+ */
61
+ function captureTelegramPayload(center: NotificationCenter): {
62
+ payloads: Array<Record<string, any>>;
63
+ } {
64
+ const payloads: Array<Record<string, any>> = [];
65
+ const adapter = center.getTelegramAdapter();
66
+ if (adapter) {
67
+ adapter.send = (async (payload: any) => {
68
+ payloads.push(payload);
69
+ return { success: true, channel: "telegram" };
70
+ }) as typeof adapter.send;
71
+ }
72
+ return { payloads };
73
+ }
74
+
75
+ async function sendProposal(center: NotificationCenter): Promise<void> {
76
+ await center.notifyWithButtons(
77
+ "ToolingPreferenceProposal",
78
+ {
79
+ jobId: "biome-abc123",
80
+ questionId: "biome-abc123",
81
+ requirement: PROPOSAL,
82
+ taskTitle: "Tooling proposal",
83
+ },
84
+ [
85
+ { text: "Yes - use Biome.js", action: "biome", targetId: "yes-biome-abc123" },
86
+ { text: "No - keep the current tools", action: "biome", targetId: "no-biome-abc123" },
87
+ ],
88
+ {
89
+ additionalDetails: { _actionPrompt: "Use Biome.js in this workspace?" },
90
+ },
91
+ );
92
+ }
93
+
94
+ beforeEach(() => {
95
+ captured = [];
96
+ originalFetch = globalThis.fetch;
97
+ globalThis.fetch = (async (input: any, init?: any) => {
98
+ const url = typeof input === "string" ? input : (input?.url ?? "");
99
+ let body: any = {};
100
+ try {
101
+ body = JSON.parse(init?.body ?? "{}");
102
+ } catch {
103
+ body = {};
104
+ }
105
+ captured.push({ url, body });
106
+
107
+ if (url.includes("typesafe.ai")) {
108
+ return new Response("unauthorized", { status: 401 });
109
+ }
110
+ return new Response(JSON.stringify({ ok: true, result: {} }), {
111
+ status: 200,
112
+ headers: { "Content-Type": "application/json" },
113
+ });
114
+ }) as typeof globalThis.fetch;
115
+ });
116
+
117
+ afterEach(() => {
118
+ globalThis.fetch = originalFetch;
119
+ });
120
+
121
+ describe("the tooling proposal payload", () => {
122
+ it("sends the proposal to Telegram with two buttons of the tooling action", async () => {
123
+ const center = createCenter();
124
+ const { payloads } = captureTelegramPayload(center);
125
+
126
+ await sendProposal(center);
127
+
128
+ const payload = payloads[0];
129
+ expect(payload).toBeDefined();
130
+
131
+ const buttons = payload.details._actionButtons as Array<{
132
+ callbackData: string;
133
+ }>;
134
+ expect(buttons).toHaveLength(2);
135
+
136
+ const parsedYes = parseCallbackData(buttons[0].callbackData);
137
+ const parsedNo = parseCallbackData(buttons[1].callbackData);
138
+
139
+ expect(parsedYes.action).toBe("biome");
140
+ expect(parsedNo.action).toBe("biome");
141
+ expect(parsedYes.targetId).toBe("yes-biome-abc123");
142
+ expect(parsedNo.targetId).toBe("no-biome-abc123");
143
+ });
144
+
145
+ it("never uses the approval action for a proposal button", async () => {
146
+ const center = createCenter();
147
+ const { payloads } = captureTelegramPayload(center);
148
+
149
+ await sendProposal(center);
150
+
151
+ const buttons = payloads[0].details._actionButtons as Array<{
152
+ callbackData: string;
153
+ }>;
154
+
155
+ for (const button of buttons) {
156
+ const parsed = parseCallbackData(button.callbackData);
157
+ expect(parsed.action).not.toBe("approve");
158
+ expect(parsed.action).not.toBe("reject");
159
+ }
160
+ });
161
+
162
+ it("sends the same buttons to LINE", async () => {
163
+ await sendProposal(createCenter());
164
+
165
+ const line = lineRequests()[0];
166
+ const messages = line?.body?.messages ?? [];
167
+ const template = messages.find((m: any) => m.type === "template");
168
+ expect(template).toBeDefined();
169
+
170
+ const actions = template.template.actions ?? [];
171
+ expect(actions).toHaveLength(2);
172
+ expect(actions[0].data).toBe("biome_yes-biome-abc123");
173
+ expect(actions[1].data).toBe("biome_no-biome-abc123");
174
+ });
175
+
176
+ it("shows the wording of the proposal on LINE", async () => {
177
+ await sendProposal(createCenter());
178
+
179
+ const line = lineRequests()[0];
180
+ const messages = line?.body?.messages ?? [];
181
+ const template = messages.find((m: any) => m.type === "template");
182
+
183
+ expect(String(template.template.title)).toContain("Biome.js");
184
+ expect(String(template.altText)).toContain("Biome.js");
185
+ });
186
+
187
+ it("sends the complete proposal to the user", async () => {
188
+ const center = createCenter();
189
+ const { payloads } = captureTelegramPayload(center);
190
+
191
+ await sendProposal(center);
192
+
193
+ const payload = payloads[0];
194
+ expect(String(payload.message)).toContain("Biome.js");
195
+ expect(String(payload.message)).toContain("ESLint");
196
+ expect(String(payload.message)).toContain("Prettier");
197
+ expect(String(payload.message)).not.toContain("...");
198
+ });
199
+
200
+ it("never sends the proposal to a channel the user turned off", async () => {
201
+ const center = createCenter();
202
+ center.setChannelEnabled("telegram", false);
203
+ const { payloads } = captureTelegramPayload(center);
204
+
205
+ await sendProposal(center);
206
+
207
+ // The button of a channel that stays silent could never be answered.
208
+ expect(payloads).toHaveLength(0);
209
+ // The other channel still receives the proposal.
210
+ expect(lineRequests().length).toBeGreaterThan(0);
211
+ });
212
+ });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/observability",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Comprehensive observability system with structured logging, tracing, metrics, and alerting",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/okf-indexer",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "OKF document indexer for SKILL.md files (RFC-0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/paperclip-integration",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Paperclip API integration: poll agent inbox, route tasks to pi.dev, Telegram alerts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/performance-optimizer",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Performance optimization analyzer for pi-harness runtime (RFC-0056)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/permission-mode",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Runtime permission modes for pi-harness - Supervised/Auto/Full-access",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/privilege-broker",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Privilege Broker — capability registry and command executor for autonomous runtime (RFC-0101 §7)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/project-analyzer",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Project analysis system for pi-harness-runtime - detects frameworks, rules, and project structure",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/project-bootstrap",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Project scaffolding from typed ProjectSpec",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/projection-engine",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-compiler",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Deterministic prompt compiler for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-versioning",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Version control for prompts with rollback support (RFC-0019)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/provider-adapter-sdk",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "SDK for building, testing, and registering AI provider adapters",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-router",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
5
5
  "type": "module",
6
6
  "main": "./dist/provider-router.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-selector",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Multi-Provider Selector — route requests by cost, quality, and latency (RFC-0012)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/providers",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — providers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/qdrant-skills",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Qdrant vector search integration for Hermes-style skill system",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/quota-manager",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — quota-manager",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/rate-limiter",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Rate limiting with token bucket algorithm (RFC-0023)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/react-vite-plugin",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "React/Vite framework analysis — components, config, TypeScript setup",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/relay",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Cloud relay for remote access - T3 Connect style for pi-harness",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/release-manager",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Release management for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/requirement-compiler",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Compiles raw requirements into validated CompiledRequirement with ambiguity detection and risk tagging",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/runtime",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/scheduler",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — scheduler",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/scheduler-adapter",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Scheduler Adapter — cron, systemd, launchd, internal adapters for autonomous runtime (RFC-0101 §6)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Session management system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session-api",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session-export",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/shared-context",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — shared-context",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/skill-mcp-client",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "MCP client for Skills SaaS backend",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/skill-registry",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Skill Registry for pi-harness-runtime — dynamic skill discovery and invocation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/skills",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "File-based skill system with pi.dev compatibility and Hermes self-improvement",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/sprint-planner",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Sprint planning engine for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/subscription-engine",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/task-compiler",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Task Compiler for pi-harness-runtime — produces deterministic task DAG from CompiledRequirement",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/telegram",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — Telegram inbound/outbound",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/tencentdb-memory",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "TencentDB Agent Memory client - sync skills to centralized knowledge base",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/tencentdb-sync",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Sync SKILL.md skills to TencentDB-Agent-Memory server (RFC-0105/0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/test-data-generator",
3
- "version": "1.1.404",
3
+ "version": "1.1.405",
4
4
  "description": "Test data generation for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",