pi-harness-runtime 1.1.146 → 1.1.148

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 (179) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +113 -0
  3. package/index.ts +136 -6
  4. package/package.json +4 -3
  5. package/packages/a2a-adapter/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/codex-watcher/package.json +1 -1
  20. package/packages/config-capture/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/cookie-sanitizer/package.json +1 -1
  25. package/packages/cost-optimizer/package.json +1 -1
  26. package/packages/dependency-analyzer/package.json +1 -1
  27. package/packages/django-plugin/package.json +1 -1
  28. package/packages/doc-generator/package.json +1 -1
  29. package/packages/evaluation-engine/package.json +1 -1
  30. package/packages/evaluation-runner/package.json +1 -1
  31. package/packages/event-bus/package.json +1 -1
  32. package/packages/event-store/package.json +1 -1
  33. package/packages/experience-replay/package.json +1 -1
  34. package/packages/feedback-collector/package.json +1 -1
  35. package/packages/file-copy-helper/dist/src/extension.js +186 -0
  36. package/packages/file-copy-helper/package.json +1 -1
  37. package/packages/framework-detector/package.json +1 -1
  38. package/packages/framework-plugin-sdk/package.json +1 -1
  39. package/packages/frappe-plugin/package.json +1 -1
  40. package/packages/generic-web-plugin/package.json +1 -1
  41. package/packages/health-monitor/package.json +1 -1
  42. package/packages/intent-analyzer/package.json +1 -1
  43. package/packages/jev-judge/package.json +1 -1
  44. package/packages/knowledge-graph/package.json +1 -1
  45. package/packages/knowledge-retrieval/package.json +1 -1
  46. package/packages/laravel-plugin/package.json +1 -1
  47. package/packages/learning-engine/package.json +1 -1
  48. package/packages/mcp-adapter/package.json +1 -1
  49. package/packages/memory-engine/package.json +1 -1
  50. package/packages/milestone-manager/package.json +1 -1
  51. package/packages/model-registry/package.json +1 -1
  52. package/packages/nextjs-plugin/package.json +1 -1
  53. package/packages/notification/dist/adapters/telegram-adapter.d.ts +38 -1
  54. package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -1
  55. package/packages/notification/dist/adapters/telegram-adapter.js +159 -5
  56. package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
  57. package/packages/notification/dist/index.d.ts +2 -0
  58. package/packages/notification/dist/index.d.ts.map +1 -1
  59. package/packages/notification/dist/index.js +2 -0
  60. package/packages/notification/dist/index.js.map +1 -1
  61. package/packages/notification/dist/notification-center.d.ts +40 -1
  62. package/packages/notification/dist/notification-center.d.ts.map +1 -1
  63. package/packages/notification/dist/notification-center.js +103 -1
  64. package/packages/notification/dist/notification-center.js.map +1 -1
  65. package/packages/notification/dist/notification-policy.d.ts +66 -0
  66. package/packages/notification/dist/notification-policy.d.ts.map +1 -0
  67. package/packages/notification/dist/notification-policy.js +153 -0
  68. package/packages/notification/dist/notification-policy.js.map +1 -0
  69. package/packages/notification/dist/src/adapters/email-adapter.d.ts +17 -0
  70. package/packages/notification/dist/src/adapters/email-adapter.d.ts.map +1 -0
  71. package/packages/notification/dist/src/adapters/email-adapter.js +89 -0
  72. package/packages/notification/dist/src/adapters/email-adapter.js.map +1 -0
  73. package/packages/notification/dist/src/adapters/line-adapter.d.ts +17 -0
  74. package/packages/notification/dist/src/adapters/line-adapter.d.ts.map +1 -0
  75. package/packages/notification/dist/src/adapters/line-adapter.js +99 -0
  76. package/packages/notification/dist/src/adapters/line-adapter.js.map +1 -0
  77. package/packages/notification/dist/src/adapters/ntfy-adapter.d.ts +17 -0
  78. package/packages/notification/dist/src/adapters/ntfy-adapter.d.ts.map +1 -0
  79. package/packages/notification/dist/src/adapters/ntfy-adapter.js +84 -0
  80. package/packages/notification/dist/src/adapters/ntfy-adapter.js.map +1 -0
  81. package/packages/notification/dist/src/adapters/telegram-adapter.d.ts +56 -0
  82. package/packages/notification/dist/src/adapters/telegram-adapter.d.ts.map +1 -0
  83. package/packages/notification/dist/src/adapters/telegram-adapter.js +251 -0
  84. package/packages/notification/dist/src/adapters/telegram-adapter.js.map +1 -0
  85. package/packages/notification/dist/src/adapters/webhook-adapter.d.ts +15 -0
  86. package/packages/notification/dist/src/adapters/webhook-adapter.d.ts.map +1 -0
  87. package/packages/notification/dist/src/adapters/webhook-adapter.js +64 -0
  88. package/packages/notification/dist/src/adapters/webhook-adapter.js.map +1 -0
  89. package/packages/notification/dist/src/base-adapter.d.ts +36 -0
  90. package/packages/notification/dist/src/base-adapter.d.ts.map +1 -0
  91. package/packages/notification/dist/src/base-adapter.js +39 -0
  92. package/packages/notification/dist/src/base-adapter.js.map +1 -0
  93. package/packages/notification/dist/src/index.d.ts +12 -0
  94. package/packages/notification/dist/src/index.d.ts.map +1 -0
  95. package/packages/notification/dist/src/index.js +12 -0
  96. package/packages/notification/dist/src/index.js.map +1 -0
  97. package/packages/notification/dist/src/notification-center.d.ts +89 -0
  98. package/packages/notification/dist/src/notification-center.d.ts.map +1 -0
  99. package/packages/notification/dist/src/notification-center.js +356 -0
  100. package/packages/notification/dist/src/notification-center.js.map +1 -0
  101. package/packages/notification/dist/src/notification-policy.d.ts +66 -0
  102. package/packages/notification/dist/src/notification-policy.d.ts.map +1 -0
  103. package/packages/notification/dist/src/notification-policy.js +153 -0
  104. package/packages/notification/dist/src/notification-policy.js.map +1 -0
  105. package/packages/notification/dist/src/telegram-webhook-handler.d.ts +86 -0
  106. package/packages/notification/dist/src/telegram-webhook-handler.d.ts.map +1 -0
  107. package/packages/notification/dist/src/telegram-webhook-handler.js +149 -0
  108. package/packages/notification/dist/src/telegram-webhook-handler.js.map +1 -0
  109. package/packages/notification/dist/src/types.d.ts +106 -0
  110. package/packages/notification/dist/src/types.d.ts.map +1 -0
  111. package/packages/notification/dist/src/types.js +7 -0
  112. package/packages/notification/dist/src/types.js.map +1 -0
  113. package/packages/notification/dist/telegram-webhook-handler.d.ts +86 -0
  114. package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -0
  115. package/packages/notification/dist/telegram-webhook-handler.js +149 -0
  116. package/packages/notification/dist/telegram-webhook-handler.js.map +1 -0
  117. package/packages/notification/dist/types.d.ts +37 -0
  118. package/packages/notification/dist/types.d.ts.map +1 -1
  119. package/packages/notification/package.json +1 -1
  120. package/packages/notification/src/adapters/telegram-adapter.ts +187 -5
  121. package/packages/notification/src/index.ts +2 -0
  122. package/packages/notification/src/notification-center.ts +139 -0
  123. package/packages/notification/src/notification-policy.ts +203 -0
  124. package/packages/notification/src/telegram-webhook-handler.ts +211 -0
  125. package/packages/notification/src/types.ts +42 -0
  126. package/packages/observability/package.json +1 -1
  127. package/packages/okf-indexer/package.json +1 -1
  128. package/packages/paperclip-integration/dist/index.d.ts.map +1 -1
  129. package/packages/paperclip-integration/dist/index.js +30 -18
  130. package/packages/paperclip-integration/dist/index.js.map +1 -1
  131. package/packages/paperclip-integration/package.json +1 -1
  132. package/packages/paperclip-integration/src/index.ts +35 -20
  133. package/packages/performance-optimizer/package.json +1 -1
  134. package/packages/privilege-broker/package.json +1 -1
  135. package/packages/project-analyzer/package.json +1 -1
  136. package/packages/project-bootstrap/package.json +1 -1
  137. package/packages/projection-engine/package.json +1 -1
  138. package/packages/prompt-compiler/package.json +1 -1
  139. package/packages/prompt-versioning/package.json +1 -1
  140. package/packages/provider-adapter-sdk/package.json +1 -1
  141. package/packages/provider-router/package.json +1 -1
  142. package/packages/provider-selector/package.json +1 -1
  143. package/packages/providers/package.json +1 -1
  144. package/packages/qdrant-skills/package.json +1 -1
  145. package/packages/quota-manager/package.json +1 -1
  146. package/packages/rate-limiter/package.json +1 -1
  147. package/packages/react-vite-plugin/package.json +1 -1
  148. package/packages/release-manager/package.json +1 -1
  149. package/packages/requirement-compiler/package.json +1 -1
  150. package/packages/runtime/package.json +1 -1
  151. package/packages/scheduler/package.json +1 -1
  152. package/packages/scheduler-adapter/package.json +1 -1
  153. package/packages/session/package.json +1 -1
  154. package/packages/session-api/package.json +1 -1
  155. package/packages/session-export/package.json +1 -1
  156. package/packages/shared-context/package.json +1 -1
  157. package/packages/skill-mcp-client/package.json +1 -1
  158. package/packages/skill-registry/package.json +1 -1
  159. package/packages/skills/package.json +1 -1
  160. package/packages/sprint-planner/package.json +1 -1
  161. package/packages/subscription-engine/package.json +1 -1
  162. package/packages/task-compiler/package.json +1 -1
  163. package/packages/tencentdb-memory/package.json +1 -1
  164. package/packages/tencentdb-sync/package.json +1 -1
  165. package/packages/test-data-generator/package.json +1 -1
  166. package/packages/test-generator/package.json +1 -1
  167. package/packages/todo-bd-sync/package.json +1 -1
  168. package/packages/token-estimation/package.json +1 -1
  169. package/packages/token-optimizer/package.json +1 -1
  170. package/packages/trajectory/package.json +1 -1
  171. package/packages/tui/package.json +1 -1
  172. package/packages/types/package.json +1 -1
  173. package/packages/workflow-events/package.json +1 -1
  174. package/packages/workspace-scanner/package.json +1 -1
  175. package/packages/worktree/package.json +1 -1
  176. package/packages/write-review/package.json +1 -1
  177. package/scripts/telegram-callback-processor.ts +180 -0
  178. package/scripts/telegram-webhook-server.ts +387 -0
  179. package/scripts/test-telegram-approval.ts +64 -0
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Notification Policy Engine for intelligent routing
3
+ *
4
+ * Decides:
5
+ * 1. Should we notify at all?
6
+ * 2. What channel(s)?
7
+ * 3. Should we include approval buttons?
8
+ * 4. What's the priority level?
9
+ *
10
+ * Can be extended with Jev for AI-powered decisions:
11
+ * import { Jev } from "@type-safe/ai";
12
+ */
13
+
14
+ export interface NotificationContext {
15
+ event: string;
16
+ jobId?: string;
17
+ requirement?: string;
18
+ error?: string;
19
+ severity?: "low" | "medium" | "high" | "critical";
20
+ requiresApproval?: boolean;
21
+ userId?: number;
22
+ timestamp?: string;
23
+ }
24
+
25
+ export interface NotificationPolicy {
26
+ shouldNotify: boolean;
27
+ channels: ("telegram" | "tui" | "log")[];
28
+ includeButtons: boolean;
29
+ priority: "low" | "normal" | "high" | "urgent";
30
+ message?: string;
31
+ }
32
+
33
+ export interface UserPreferences {
34
+ telegramEnabled: boolean;
35
+ telegramChatId?: string;
36
+ telegramBotToken?: string;
37
+ tuiEnabled: boolean;
38
+ notifyOnError: boolean;
39
+ notifyOnCompletion: boolean;
40
+ notifyOnApprovalRequired: boolean;
41
+ }
42
+
43
+ // Default preferences
44
+ const DEFAULT_PREFERENCES: UserPreferences = {
45
+ telegramEnabled: false,
46
+ tuiEnabled: true,
47
+ notifyOnError: true,
48
+ notifyOnCompletion: false,
49
+ notifyOnApprovalRequired: true,
50
+ };
51
+
52
+ /**
53
+ * Events that require user approval
54
+ */
55
+ const APPROVAL_REQUIRED_EVENTS = new Set([
56
+ "HumanReviewNeeded",
57
+ "WaitingForUserInput",
58
+ "ApprovalRequired",
59
+ "ConfirmDeploy",
60
+ "ConfirmDelete",
61
+ "ConfirmCriticalAction",
62
+ ]);
63
+
64
+ /**
65
+ * High-priority events (always notify)
66
+ */
67
+ const HIGH_PRIORITY_EVENTS = new Set([
68
+ "QuotaExhausted",
69
+ "CriticalError",
70
+ "HumanReviewNeeded",
71
+ "WaitingForUserInput",
72
+ "JobFailed",
73
+ "SystemAlert",
74
+ ]);
75
+
76
+ /**
77
+ * Notification policy engine
78
+ */
79
+ export class NotificationPolicyEngine {
80
+ private preferences: UserPreferences;
81
+
82
+ constructor(preferences?: Partial<UserPreferences>) {
83
+ this.preferences = { ...DEFAULT_PREFERENCES, ...preferences };
84
+ }
85
+
86
+ /**
87
+ * Update user preferences
88
+ */
89
+ updatePreferences(prefs: Partial<UserPreferences>): void {
90
+ this.preferences = { ...this.preferences, ...prefs };
91
+ }
92
+
93
+ /**
94
+ * Evaluate notification policy
95
+ */
96
+ evaluate(context: NotificationContext): NotificationPolicy {
97
+ const event = context.event;
98
+ const severity = context.severity || this.inferSeverity(event);
99
+ const needsApproval = APPROVAL_REQUIRED_EVENTS.has(event);
100
+
101
+ // Build channels
102
+ const channels: ("telegram" | "tui" | "log")[] = [];
103
+
104
+ if (this.preferences.telegramEnabled && this.preferences.telegramChatId) {
105
+ channels.push("telegram");
106
+ }
107
+
108
+ if (this.preferences.tuiEnabled) {
109
+ channels.push("tui");
110
+ }
111
+
112
+ // Decide based on event type and severity
113
+ let shouldNotify = false;
114
+ let includeButtons = false;
115
+ let priority: NotificationPolicy["priority"] = "normal";
116
+
117
+ switch (event) {
118
+ case "HumanReviewNeeded":
119
+ case "WaitingForUserInput":
120
+ case "ApprovalRequired":
121
+ shouldNotify = this.preferences.notifyOnApprovalRequired;
122
+ includeButtons = true;
123
+ priority = "high";
124
+ break;
125
+
126
+ case "CriticalError":
127
+ case "SystemAlert":
128
+ shouldNotify = true;
129
+ includeButtons = needsApproval;
130
+ priority = "urgent";
131
+ break;
132
+
133
+ case "QuotaExhausted":
134
+ shouldNotify = true;
135
+ includeButtons = false;
136
+ priority = "high";
137
+ break;
138
+
139
+ case "JobCompleted":
140
+ shouldNotify = this.preferences.notifyOnCompletion;
141
+ includeButtons = false;
142
+ priority = "low";
143
+ break;
144
+
145
+ case "Error":
146
+ case "JobFailed":
147
+ shouldNotify = this.preferences.notifyOnError;
148
+ includeButtons = needsApproval;
149
+ priority = severity === "high" || severity === "critical" ? "high" : "normal";
150
+ break;
151
+
152
+ default:
153
+ shouldNotify = severity === "high" || severity === "critical";
154
+ includeButtons = needsApproval;
155
+ priority = severity === "critical" ? "urgent" : severity === "high" ? "high" : "low";
156
+ }
157
+
158
+ // Always notify for high-priority events
159
+ if (HIGH_PRIORITY_EVENTS.has(event)) {
160
+ shouldNotify = true;
161
+ if (priority !== "urgent") {
162
+ priority = "high";
163
+ }
164
+ }
165
+
166
+ return {
167
+ shouldNotify,
168
+ channels: channels.length > 0 ? channels : ["log"],
169
+ includeButtons,
170
+ priority,
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Infer severity from event name
176
+ */
177
+ private inferSeverity(event: string): "low" | "medium" | "high" | "critical" {
178
+ if (event.includes("Critical") || event.includes("Emergency")) {
179
+ return "critical";
180
+ }
181
+ if (event.includes("Error") || event.includes("Failed") || event.includes("Exhausted")) {
182
+ return "high";
183
+ }
184
+ if (event.includes("Warning") || event.includes("Alert")) {
185
+ return "medium";
186
+ }
187
+ return "low";
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Check if an event requires approval buttons
193
+ */
194
+ export function requiresApproval(event: string): boolean {
195
+ return APPROVAL_REQUIRED_EVENTS.has(event);
196
+ }
197
+
198
+ /**
199
+ * Check if an event is high priority
200
+ */
201
+ export function isHighPriority(event: string): boolean {
202
+ return HIGH_PRIORITY_EVENTS.has(event);
203
+ }
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Telegram Webhook Handler — RFC-0022
3
+ *
4
+ * Handles incoming webhook updates from Telegram (callback queries, messages).
5
+ * This enables 2-way communication with inline keyboard buttons.
6
+ */
7
+
8
+ import type { TelegramAdapter } from "./adapters/telegram-adapter.js";
9
+ import type { TelegramCallbackHandler, TelegramCallbackQuery } from "./types.js";
10
+
11
+ /**
12
+ * Predefined action prefixes for callback data
13
+ */
14
+ export const CallbackActions = {
15
+ /** Approve/resume action */
16
+ APPROVE: "approve",
17
+ /** Reject/cancel action */
18
+ REJECT: "reject",
19
+ /** View details action */
20
+ VIEW: "view",
21
+ /** Custom action prefix */
22
+ CUSTOM: "custom",
23
+ } as const;
24
+
25
+ /**
26
+ * Parsed callback data structure
27
+ */
28
+ export interface ParsedCallback {
29
+ action: string;
30
+ targetId: string;
31
+ payload?: Record<string, string>;
32
+ }
33
+
34
+ /**
35
+ * Parse callback data string into structured object
36
+ * Format: "action_targetId" or "action_targetId_key1=val1,key2=val2"
37
+ */
38
+ export function parseCallbackData(data: string): ParsedCallback {
39
+ const parts = data.split("_");
40
+ const action = parts[0] || "";
41
+ const targetId = parts[1] || "";
42
+ let payload: Record<string, string> | undefined;
43
+
44
+ // Check for additional payload
45
+ const payloadPart = parts.slice(2).join("_");
46
+ if (payloadPart && payloadPart.includes("=")) {
47
+ payload = {};
48
+ for (const pair of payloadPart.split(",")) {
49
+ const [key, value] = pair.split("=");
50
+ if (key && value) {
51
+ payload[key] = value;
52
+ }
53
+ }
54
+ }
55
+
56
+ return { action, targetId, payload };
57
+ }
58
+
59
+ /**
60
+ * Build callback data string from components
61
+ */
62
+ export function buildCallbackData(
63
+ action: string,
64
+ targetId: string,
65
+ payload?: Record<string, string>,
66
+ ): string {
67
+ let data = `${action}_${targetId}`;
68
+ if (payload && Object.keys(payload).length > 0) {
69
+ const pairs = Object.entries(payload)
70
+ .map(([k, v]) => `${k}=${v}`)
71
+ .join(",");
72
+ data += `_${pairs}`;
73
+ }
74
+ return data;
75
+ }
76
+
77
+ /**
78
+ * Create a standard Yes/No callback handler
79
+ */
80
+ export function createYesNoHandler(options: {
81
+ /** Called when user clicks "Yes/Approve" */
82
+ onApprove?: (targetId: string, query: TelegramCallbackQuery) => Promise<void> | void;
83
+ /** Called when user clicks "No/Reject" */
84
+ onReject?: (targetId: string, query: TelegramCallbackQuery) => Promise<void> | void;
85
+ /** Custom handler for other callback actions */
86
+ onCustom?: (action: string, targetId: string, query: TelegramCallbackQuery) => Promise<void> | void;
87
+ /** Job manager reference for default resume/cancel behavior */
88
+ jobManager?: {
89
+ resume: (jobId: string) => Promise<void>;
90
+ cancel: (jobId: string) => Promise<void>;
91
+ };
92
+ }): TelegramCallbackHandler {
93
+ return async (data: string, query: TelegramCallbackQuery) => {
94
+ const parsed = parseCallbackData(data);
95
+ const { action, targetId } = parsed;
96
+
97
+ console.log(
98
+ `[TelegramWebhook] Callback: action=${action}, target=${targetId}, from=${query.from.username || query.from.first_name}`,
99
+ );
100
+
101
+ switch (action) {
102
+ case CallbackActions.APPROVE:
103
+ if (options.onApprove) {
104
+ await options.onApprove(targetId, query);
105
+ } else if (options.jobManager) {
106
+ await options.jobManager.resume(targetId);
107
+ console.log(`[TelegramWebhook] Job resumed: ${targetId}`);
108
+ }
109
+ break;
110
+
111
+ case CallbackActions.REJECT:
112
+ if (options.onReject) {
113
+ await options.onReject(targetId, query);
114
+ } else if (options.jobManager) {
115
+ await options.jobManager.cancel(targetId);
116
+ console.log(`[TelegramWebhook] Job cancelled: ${targetId}`);
117
+ }
118
+ break;
119
+
120
+ case CallbackActions.VIEW:
121
+ if (options.onCustom) {
122
+ await options.onCustom(action, targetId, query);
123
+ }
124
+ break;
125
+
126
+ default:
127
+ if (options.onCustom) {
128
+ await options.onCustom(action, targetId, query);
129
+ } else {
130
+ console.warn(`[TelegramWebhook] Unknown action: ${action}`);
131
+ }
132
+ }
133
+ };
134
+ }
135
+
136
+ /**
137
+ * Telegram webhook route handler for Express/Fastify/etc.
138
+ */
139
+ export function createTelegramWebhookHandler(
140
+ adapter: TelegramAdapter,
141
+ secretToken?: string,
142
+ ) {
143
+ return async (req: { body: Record<string, unknown>; headers: Record<string, string | undefined> }, res: { sendStatus: (code: number) => void }) => {
144
+ // Verify secret token
145
+ if (secretToken) {
146
+ const receivedToken = req.headers["x-telegram-bot-api-secret-token"] as string | undefined;
147
+ if (receivedToken !== secretToken) {
148
+ console.error("[TelegramWebhook] Unauthorized webhook request");
149
+ res.sendStatus(403);
150
+ return;
151
+ }
152
+ }
153
+
154
+ try {
155
+ await adapter.handleWebhookUpdate(req.body);
156
+ res.sendStatus(200);
157
+ } catch (error) {
158
+ console.error("[TelegramWebhook] Error processing update:", error);
159
+ res.sendStatus(500);
160
+ }
161
+ };
162
+ }
163
+
164
+ /**
165
+ * Notification payload helper with inline keyboard support
166
+ */
167
+ export function createInteractivePayload(
168
+ event: string,
169
+ jobId: string,
170
+ title: string,
171
+ message: string,
172
+ buttons: Array<{ text: string; action: string; targetId: string }>,
173
+ details?: Record<string, unknown>,
174
+ ): {
175
+ event: string;
176
+ jobId: string;
177
+ timestamp: string;
178
+ title: string;
179
+ message: string;
180
+ details?: Record<string, unknown>;
181
+ } {
182
+ return {
183
+ event,
184
+ jobId,
185
+ timestamp: new Date().toISOString(),
186
+ title,
187
+ message,
188
+ details: {
189
+ ...details,
190
+ _callbackButtons: buttons.map((b) => ({
191
+ text: b.text,
192
+ callbackData: buildCallbackData(b.action, b.targetId),
193
+ })),
194
+ },
195
+ };
196
+ }
197
+
198
+ /**
199
+ * Update TelegramConfig to include action buttons from payload details
200
+ */
201
+ export function extractButtonsFromPayload(
202
+ details: Record<string, unknown> | undefined,
203
+ ): Array<{ text: string; callbackData: string }> | undefined {
204
+ if (!details) return undefined;
205
+
206
+ const cb = details._callbackButtons as
207
+ | Array<{ text: string; callbackData: string }>
208
+ | undefined;
209
+
210
+ return cb?.length ? cb : undefined;
211
+ }
@@ -52,8 +52,50 @@ export interface TelegramConfig {
52
52
  botToken: string;
53
53
  chatId: string;
54
54
  parseMode?: "MarkdownV2" | "HTML" | "Markdown";
55
+ // Inline keyboard support for 2-way communication
56
+ enableInlineKeyboard?: boolean;
57
+ actionButtons?: InlineKeyboardButton[];
55
58
  }
56
59
 
60
+ /**
61
+ * Inline keyboard button for Telegram interactive messages
62
+ */
63
+ export interface InlineKeyboardButton {
64
+ /** Button text displayed to user */
65
+ text: string;
66
+ /** Callback data sent when button is clicked */
67
+ callbackData: string;
68
+ /** Optional URL to open when button is clicked (mutually exclusive with callbackData) */
69
+ url?: string;
70
+ }
71
+
72
+ /**
73
+ * Callback query received from Telegram inline keyboard
74
+ */
75
+ export interface TelegramCallbackQuery {
76
+ id: string;
77
+ from: {
78
+ id: number;
79
+ is_bot: boolean;
80
+ first_name: string;
81
+ username?: string;
82
+ };
83
+ chat_instance: string;
84
+ data: string;
85
+ message?: {
86
+ chat: { id: number };
87
+ message_id: number;
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Callback handler function type
93
+ */
94
+ export type TelegramCallbackHandler = (
95
+ callbackData: string,
96
+ query: TelegramCallbackQuery
97
+ ) => Promise<void> | void;
98
+
57
99
  export interface NtfyConfig {
58
100
  server: string; // e.g., "https://ntfy.sh"
59
101
  topic: string;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/observability",
3
- "version": "1.1.146",
3
+ "version": "1.1.148",
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.146",
3
+ "version": "1.1.148",
4
4
  "description": "OKF document indexer for SKILL.md files (RFC-0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -203,26 +203,38 @@ export function hasPaperclipConfig() {
203
203
  * Get Paperclip config from environment / keys file
204
204
  */
205
205
  export function getPaperclipConfig() {
206
- const apiKey = process.env.PAPERCLIP_API_KEY ||
207
- process.env.PAPERCLIP_API_KEY;
208
- const baseUrl = process.env.PAPERCLIP_BASE_URL ||
209
- "https://api.paperclip.inc/api";
210
- if (!apiKey) {
211
- const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
212
- try {
213
- const { readFileSync, existsSync } = require("fs");
214
- const path = `${homedir}/.pi-harness-runtime/keys/paperclip-api-key.txt`;
215
- if (!existsSync(path))
216
- return null;
217
- const key = readFileSync(path, "utf8").trim();
218
- if (!key || key.length < 10)
219
- return null;
220
- return { apiKey: key, baseUrl };
206
+ const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
207
+ const keysDir = `${homedir}/.pi-harness-runtime/keys`;
208
+ try {
209
+ const { readFileSync, existsSync } = require("fs");
210
+ // Check for config file first (JSON with multiple settings)
211
+ const configPath = `${keysDir}/paperclip-config.json`;
212
+ if (existsSync(configPath)) {
213
+ const config = JSON.parse(readFileSync(configPath, "utf8"));
214
+ if (config.apiKey && config.baseUrl) {
215
+ return {
216
+ apiKey: config.apiKey,
217
+ baseUrl: config.baseUrl,
218
+ companyId: config.companyId,
219
+ };
220
+ }
221
221
  }
222
- catch {
222
+ // Fallback to individual files
223
+ const apiKeyPath = `${keysDir}/paperclip-api-key.txt`;
224
+ const baseUrlPath = `${keysDir}/paperclip-base-url.txt`;
225
+ if (!existsSync(apiKeyPath))
223
226
  return null;
224
- }
227
+ const apiKey = readFileSync(apiKeyPath, "utf8").trim();
228
+ if (!apiKey || apiKey.length < 10)
229
+ return null;
230
+ // Default to self-hosted server URL
231
+ const baseUrl = existsSync(baseUrlPath)
232
+ ? readFileSync(baseUrlPath, "utf8").trim()
233
+ : "https://paperclip.moo-vpn.online/api";
234
+ return { apiKey, baseUrl };
235
+ }
236
+ catch {
237
+ return null;
225
238
  }
226
- return { apiKey, baseUrl };
227
239
  }
228
240
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/paperclip-integration",
3
- "version": "1.1.146",
3
+ "version": "1.1.148",
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",
@@ -301,26 +301,41 @@ export function hasPaperclipConfig(): boolean {
301
301
  * Get Paperclip config from environment / keys file
302
302
  */
303
303
  export function getPaperclipConfig(): PaperclipConfig | null {
304
- const apiKey =
305
- process.env.PAPERCLIP_API_KEY ||
306
- process.env.PAPERCLIP_API_KEY;
307
- const baseUrl =
308
- process.env.PAPERCLIP_BASE_URL ||
309
- "https://api.paperclip.inc/api";
310
-
311
- if (!apiKey) {
312
- const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
313
- try {
314
- const { readFileSync, existsSync } = require("fs");
315
- const path = `${homedir}/.pi-harness-runtime/keys/paperclip-api-key.txt`;
316
- if (!existsSync(path)) return null;
317
- const key = readFileSync(path, "utf8").trim();
318
- if (!key || key.length < 10) return null;
319
- return { apiKey: key, baseUrl };
320
- } catch {
321
- return null;
304
+ const homedir = process.env.HOME || process.env.USERPROFILE || "/home/frappe";
305
+ const keysDir = `${homedir}/.pi-harness-runtime/keys`;
306
+
307
+ try {
308
+ const { readFileSync, existsSync } = require("fs");
309
+
310
+ // Check for config file first (JSON with multiple settings)
311
+ const configPath = `${keysDir}/paperclip-config.json`;
312
+ if (existsSync(configPath)) {
313
+ const config = JSON.parse(readFileSync(configPath, "utf8"));
314
+ if (config.apiKey && config.baseUrl) {
315
+ return {
316
+ apiKey: config.apiKey,
317
+ baseUrl: config.baseUrl,
318
+ companyId: config.companyId,
319
+ };
320
+ }
322
321
  }
323
- }
324
322
 
325
- return { apiKey, baseUrl };
323
+ // Fallback to individual files
324
+ const apiKeyPath = `${keysDir}/paperclip-api-key.txt`;
325
+ const baseUrlPath = `${keysDir}/paperclip-base-url.txt`;
326
+
327
+ if (!existsSync(apiKeyPath)) return null;
328
+
329
+ const apiKey = readFileSync(apiKeyPath, "utf8").trim();
330
+ if (!apiKey || apiKey.length < 10) return null;
331
+
332
+ // Default to self-hosted server URL
333
+ const baseUrl = existsSync(baseUrlPath)
334
+ ? readFileSync(baseUrlPath, "utf8").trim()
335
+ : "https://paperclip.moo-vpn.online/api";
336
+
337
+ return { apiKey, baseUrl };
338
+ } catch {
339
+ return null;
340
+ }
326
341
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/performance-optimizer",
3
- "version": "1.1.146",
3
+ "version": "1.1.148",
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/privilege-broker",
3
- "version": "1.1.146",
3
+ "version": "1.1.148",
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",