pi-harness-runtime 1.1.95 → 1.1.97

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 (226) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/harness/loop-runtime.ts +3 -0
  3. package/index.ts +130 -29
  4. package/package.json +2 -1
  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/config-capture/package.json +1 -1
  20. package/packages/context-compiler/package.json +1 -1
  21. package/packages/context-discovery/package.json +1 -1
  22. package/packages/context-manager/package.json +1 -1
  23. package/packages/cookie-sanitizer/package.json +1 -1
  24. package/packages/cost-optimizer/package.json +1 -1
  25. package/packages/dependency-analyzer/package.json +1 -1
  26. package/packages/django-plugin/package.json +1 -1
  27. package/packages/doc-generator/package.json +1 -1
  28. package/packages/evaluation-engine/package.json +1 -1
  29. package/packages/evaluation-runner/package.json +1 -1
  30. package/packages/event-bus/package.json +1 -1
  31. package/packages/event-store/package.json +1 -1
  32. package/packages/experience-replay/package.json +1 -1
  33. package/packages/feedback-collector/package.json +1 -1
  34. package/packages/file-copy-helper/package.json +1 -1
  35. package/packages/framework-detector/package.json +1 -1
  36. package/packages/framework-plugin-sdk/package.json +1 -1
  37. package/packages/frappe-plugin/package.json +1 -1
  38. package/packages/generic-web-plugin/package.json +1 -1
  39. package/packages/health-monitor/package.json +1 -1
  40. package/packages/intent-analyzer/package.json +1 -1
  41. package/packages/jev-judge/package.json +1 -1
  42. package/packages/knowledge-graph/package.json +1 -1
  43. package/packages/knowledge-retrieval/package.json +1 -1
  44. package/packages/laravel-plugin/package.json +1 -1
  45. package/packages/learning-engine/package.json +1 -1
  46. package/packages/mcp-adapter/package.json +1 -1
  47. package/packages/memory-engine/package.json +1 -1
  48. package/packages/milestone-manager/package.json +1 -1
  49. package/packages/model-registry/package.json +1 -1
  50. package/packages/nextjs-plugin/package.json +1 -1
  51. package/packages/notification/package.json +1 -1
  52. package/packages/observability/package.json +1 -1
  53. package/packages/okf-indexer/package.json +1 -1
  54. package/packages/performance-optimizer/package.json +1 -1
  55. package/packages/privilege-broker/package.json +1 -1
  56. package/packages/project-analyzer/package.json +1 -1
  57. package/packages/project-bootstrap/package.json +1 -1
  58. package/packages/projection-engine/package.json +1 -1
  59. package/packages/prompt-compiler/package.json +1 -1
  60. package/packages/prompt-versioning/package.json +1 -1
  61. package/packages/provider-adapter-sdk/package.json +1 -1
  62. package/packages/provider-router/package.json +1 -1
  63. package/packages/provider-selector/package.json +1 -1
  64. package/packages/providers/package.json +1 -1
  65. package/packages/qdrant-skills/dist/client.d.ts +51 -0
  66. package/packages/qdrant-skills/dist/client.d.ts.map +1 -0
  67. package/packages/qdrant-skills/dist/client.js +105 -0
  68. package/packages/qdrant-skills/dist/client.js.map +1 -0
  69. package/packages/qdrant-skills/dist/embedder.d.ts +39 -0
  70. package/packages/qdrant-skills/dist/embedder.d.ts.map +1 -0
  71. package/packages/qdrant-skills/dist/embedder.js +101 -0
  72. package/packages/qdrant-skills/dist/embedder.js.map +1 -0
  73. package/packages/qdrant-skills/dist/index.d.ts +25 -0
  74. package/packages/qdrant-skills/dist/index.d.ts.map +1 -0
  75. package/packages/qdrant-skills/dist/index.js +25 -0
  76. package/packages/qdrant-skills/dist/index.js.map +1 -0
  77. package/packages/qdrant-skills/package.json +27 -0
  78. package/packages/qdrant-skills/src/client.ts +178 -0
  79. package/packages/qdrant-skills/src/embedder.ts +137 -0
  80. package/packages/qdrant-skills/src/index.ts +42 -0
  81. package/packages/quota-manager/package.json +1 -1
  82. package/packages/rate-limiter/package.json +1 -1
  83. package/packages/react-vite-plugin/package.json +1 -1
  84. package/packages/release-manager/package.json +1 -1
  85. package/packages/requirement-compiler/package.json +1 -1
  86. package/packages/runtime/package.json +1 -1
  87. package/packages/scheduler/package.json +1 -1
  88. package/packages/scheduler-adapter/package.json +1 -1
  89. package/packages/session/package.json +1 -1
  90. package/packages/session-api/package.json +1 -1
  91. package/packages/session-export/package.json +1 -1
  92. package/packages/shared-context/package.json +1 -1
  93. package/packages/skill-mcp-client/package.json +1 -1
  94. package/packages/skill-registry/package.json +1 -1
  95. package/packages/skills/dist/index.d.ts +40 -0
  96. package/packages/skills/dist/index.d.ts.map +1 -0
  97. package/packages/skills/dist/index.js +84 -0
  98. package/packages/skills/dist/index.js.map +1 -0
  99. package/packages/skills/dist/linter.d.ts +38 -0
  100. package/packages/skills/dist/linter.d.ts.map +1 -0
  101. package/packages/skills/dist/linter.js +323 -0
  102. package/packages/skills/dist/linter.js.map +1 -0
  103. package/packages/skills/dist/loader.d.ts +74 -0
  104. package/packages/skills/dist/loader.d.ts.map +1 -0
  105. package/packages/skills/dist/loader.js +280 -0
  106. package/packages/skills/dist/loader.js.map +1 -0
  107. package/packages/skills/dist/parser.d.ts +32 -0
  108. package/packages/skills/dist/parser.d.ts.map +1 -0
  109. package/packages/skills/dist/parser.js +459 -0
  110. package/packages/skills/dist/parser.js.map +1 -0
  111. package/packages/skills/dist/scanner.d.ts +33 -0
  112. package/packages/skills/dist/scanner.d.ts.map +1 -0
  113. package/packages/skills/dist/scanner.js +257 -0
  114. package/packages/skills/dist/scanner.js.map +1 -0
  115. package/packages/skills/dist/skill-commands.d.ts +33 -0
  116. package/packages/skills/dist/skill-commands.d.ts.map +1 -0
  117. package/packages/skills/dist/skill-commands.js +239 -0
  118. package/packages/skills/dist/skill-commands.js.map +1 -0
  119. package/packages/skills/dist/skill-tool.d.ts +120 -0
  120. package/packages/skills/dist/skill-tool.d.ts.map +1 -0
  121. package/packages/skills/dist/skill-tool.js +239 -0
  122. package/packages/skills/dist/skill-tool.js.map +1 -0
  123. package/packages/skills/dist/skill-versioning.d.ts +123 -0
  124. package/packages/skills/dist/skill-versioning.d.ts.map +1 -0
  125. package/packages/skills/dist/skill-versioning.js +240 -0
  126. package/packages/skills/dist/skill-versioning.js.map +1 -0
  127. package/packages/skills/dist/types.d.ts +226 -0
  128. package/packages/skills/dist/types.d.ts.map +1 -0
  129. package/packages/skills/dist/types.js +21 -0
  130. package/packages/skills/dist/types.js.map +1 -0
  131. package/packages/skills/package.json +46 -0
  132. package/packages/skills/src/index.ts +95 -0
  133. package/packages/skills/src/linter.ts +371 -0
  134. package/packages/skills/src/loader.ts +335 -0
  135. package/packages/skills/src/parser.ts +548 -0
  136. package/packages/skills/src/scanner.ts +322 -0
  137. package/packages/skills/src/skill-commands.ts +318 -0
  138. package/packages/skills/src/skill-tool.ts +324 -0
  139. package/packages/skills/src/skill-versioning.ts +345 -0
  140. package/packages/skills/src/types.ts +259 -0
  141. package/packages/skills/test/init-skills.test.ts +118 -0
  142. package/packages/sprint-planner/package.json +1 -1
  143. package/packages/subscription-engine/package.json +1 -1
  144. package/packages/task-compiler/package.json +1 -1
  145. package/packages/tencentdb-memory/package.json +1 -1
  146. package/packages/tencentdb-sync/package.json +1 -1
  147. package/packages/test-data-generator/package.json +1 -1
  148. package/packages/test-generator/package.json +1 -1
  149. package/packages/todo-bd-sync/package.json +1 -1
  150. package/packages/token-estimation/package.json +1 -1
  151. package/packages/token-optimizer/package.json +1 -1
  152. package/packages/trajectory/dist/src/curator.d.ts +189 -0
  153. package/packages/trajectory/dist/src/curator.d.ts.map +1 -0
  154. package/packages/trajectory/dist/src/curator.js +340 -0
  155. package/packages/trajectory/dist/src/curator.js.map +1 -0
  156. package/packages/trajectory/dist/src/journey-renderer.d.ts +53 -0
  157. package/packages/trajectory/dist/src/journey-renderer.d.ts.map +1 -0
  158. package/packages/trajectory/dist/src/journey-renderer.js +324 -0
  159. package/packages/trajectory/dist/src/journey-renderer.js.map +1 -0
  160. package/packages/trajectory/dist/src/learning-graph.d.ts +159 -0
  161. package/packages/trajectory/dist/src/learning-graph.d.ts.map +1 -0
  162. package/packages/trajectory/dist/src/learning-graph.js +258 -0
  163. package/packages/trajectory/dist/src/learning-graph.js.map +1 -0
  164. package/packages/trajectory/dist/src/memory-store.d.ts +146 -0
  165. package/packages/trajectory/dist/src/memory-store.d.ts.map +1 -0
  166. package/packages/trajectory/dist/src/memory-store.js +472 -0
  167. package/packages/trajectory/dist/src/memory-store.js.map +1 -0
  168. package/packages/trajectory/dist/src/review-fork.d.ts +164 -0
  169. package/packages/trajectory/dist/src/review-fork.d.ts.map +1 -0
  170. package/packages/trajectory/dist/src/review-fork.js +332 -0
  171. package/packages/trajectory/dist/src/review-fork.js.map +1 -0
  172. package/packages/trajectory/dist/src/write-approval.d.ts +136 -0
  173. package/packages/trajectory/dist/src/write-approval.d.ts.map +1 -0
  174. package/packages/trajectory/dist/src/write-approval.js +281 -0
  175. package/packages/trajectory/dist/src/write-approval.js.map +1 -0
  176. package/packages/trajectory/package.json +1 -1
  177. package/packages/trajectory/src/curator.ts +485 -0
  178. package/packages/trajectory/src/journey-renderer.ts +399 -0
  179. package/packages/trajectory/src/learning-graph.ts +363 -0
  180. package/packages/trajectory/src/memory-store.ts +578 -0
  181. package/packages/trajectory/src/review-fork.ts +450 -0
  182. package/packages/trajectory/src/write-approval.ts +372 -0
  183. package/packages/tui/package.json +1 -1
  184. package/packages/types/package.json +1 -1
  185. package/packages/workflow-events/package.json +1 -1
  186. package/packages/workspace-scanner/package.json +1 -1
  187. package/packages/worktree/package.json +1 -1
  188. package/packages/write-review/dist/blackboard.d.ts +98 -0
  189. package/packages/write-review/dist/blackboard.d.ts.map +1 -0
  190. package/packages/write-review/dist/blackboard.js +289 -0
  191. package/packages/write-review/dist/blackboard.js.map +1 -0
  192. package/packages/write-review/dist/event-bus.d.ts +106 -0
  193. package/packages/write-review/dist/event-bus.d.ts.map +1 -0
  194. package/packages/write-review/dist/event-bus.js +294 -0
  195. package/packages/write-review/dist/event-bus.js.map +1 -0
  196. package/packages/write-review/dist/gate.d.ts +37 -0
  197. package/packages/write-review/dist/gate.d.ts.map +1 -0
  198. package/packages/write-review/dist/gate.js +138 -0
  199. package/packages/write-review/dist/gate.js.map +1 -0
  200. package/packages/write-review/dist/index.d.ts +22 -0
  201. package/packages/write-review/dist/index.d.ts.map +1 -0
  202. package/packages/write-review/dist/index.js +60 -0
  203. package/packages/write-review/dist/index.js.map +1 -0
  204. package/packages/write-review/dist/injection.d.ts +40 -0
  205. package/packages/write-review/dist/injection.d.ts.map +1 -0
  206. package/packages/write-review/dist/injection.js +179 -0
  207. package/packages/write-review/dist/injection.js.map +1 -0
  208. package/packages/write-review/dist/review.d.ts +54 -0
  209. package/packages/write-review/dist/review.d.ts.map +1 -0
  210. package/packages/write-review/dist/review.js +154 -0
  211. package/packages/write-review/dist/review.js.map +1 -0
  212. package/packages/write-review/dist/trigger.d.ts +39 -0
  213. package/packages/write-review/dist/trigger.d.ts.map +1 -0
  214. package/packages/write-review/dist/trigger.js +107 -0
  215. package/packages/write-review/dist/trigger.js.map +1 -0
  216. package/packages/write-review/dist/types.d.ts +78 -0
  217. package/packages/write-review/dist/types.d.ts.map +1 -0
  218. package/packages/write-review/dist/types.js +26 -0
  219. package/packages/write-review/dist/types.js.map +1 -0
  220. package/packages/write-review/package.json +1 -1
  221. package/packages/write-review/src/event-bus.ts +351 -0
  222. package/packages/write-review/src/index.ts +1 -0
  223. package/packages/write-review/src/injection.ts +25 -3
  224. package/proactive-compact.ts +51 -7
  225. package/scripts/sync-skills.ts +275 -0
  226. package/scripts/sync-to-qdrant.ts +398 -0
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Write-Review Blackboard
3
+ *
4
+ * File-based coordination between writer and reviewer agents.
5
+ * Location: {project}/.write-review/status.json
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
8
+ import { join } from "path";
9
+ const DEFAULT_DIR = ".write-review";
10
+ const STATUS_FILE = "status.json";
11
+ export class WriteReviewBlackboard {
12
+ projectPath;
13
+ dir;
14
+ status = null;
15
+ constructor(projectPath, dir = DEFAULT_DIR) {
16
+ this.projectPath = projectPath;
17
+ this.dir = join(projectPath, dir);
18
+ }
19
+ /**
20
+ * Initialize a new write-review session
21
+ */
22
+ init() {
23
+ mkdirSync(this.dir, { recursive: true });
24
+ this.status = {
25
+ projectPath: this.projectPath,
26
+ phase: "idle",
27
+ writerDone: false,
28
+ iteration: 0,
29
+ createdAt: new Date().toISOString(),
30
+ updatedAt: new Date().toISOString(),
31
+ };
32
+ this.save();
33
+ }
34
+ /**
35
+ * Load status from disk
36
+ */
37
+ load() {
38
+ const path = join(this.dir, STATUS_FILE);
39
+ if (!existsSync(path)) {
40
+ return null;
41
+ }
42
+ try {
43
+ this.status = JSON.parse(readFileSync(path, "utf-8"));
44
+ return this.status;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Save status to disk
52
+ */
53
+ save() {
54
+ if (!this.status)
55
+ return;
56
+ this.status.updatedAt = new Date().toISOString();
57
+ mkdirSync(this.dir, { recursive: true });
58
+ const path = join(this.dir, STATUS_FILE);
59
+ writeFileSync(path, JSON.stringify(this.status, null, 2));
60
+ }
61
+ /**
62
+ * Get current status
63
+ */
64
+ getStatus() {
65
+ return this.status;
66
+ }
67
+ /**
68
+ * Record the automatic decision that selected or skipped PING-PONG.
69
+ * This is the durable middleware state shared by separate agent terminals.
70
+ */
71
+ recordPingPongDecision(snapshot) {
72
+ if (!this.status)
73
+ this.init();
74
+ this.status.mode = "ping_pong";
75
+ this.status.pingPong = snapshot;
76
+ this.status.writerMessage = snapshot.request;
77
+ if (snapshot.decision === "run_ping_pong") {
78
+ this.status.phase = "writing";
79
+ this.status.writerDone = false;
80
+ }
81
+ else {
82
+ this.status.phase = "idle";
83
+ }
84
+ this.save();
85
+ }
86
+ /**
87
+ * Start a new write session
88
+ */
89
+ startWriting() {
90
+ if (!this.status)
91
+ this.init();
92
+ this.status.phase = "writing";
93
+ this.status.writerDone = false;
94
+ this.status.iteration++;
95
+ this.save();
96
+ }
97
+ /**
98
+ * Mark writer as done
99
+ */
100
+ writerDone(message) {
101
+ if (!this.status)
102
+ return;
103
+ this.status.writerDone = true;
104
+ this.status.writerMessage = message;
105
+ this.status.phase = "pending_review";
106
+ this.save();
107
+ }
108
+ /**
109
+ * Start reviewing
110
+ */
111
+ startReview() {
112
+ if (!this.status)
113
+ return;
114
+ this.status.phase = "reviewing";
115
+ this.status.reviewerStarted = new Date().toISOString();
116
+ this.save();
117
+ }
118
+ /**
119
+ * Record verdict
120
+ */
121
+ setVerdict(verdict, message) {
122
+ if (!this.status)
123
+ return;
124
+ this.status.verdict = verdict;
125
+ this.status.verdictMessage = message;
126
+ switch (verdict) {
127
+ case "approved":
128
+ this.status.phase = "approved";
129
+ this.status.approvedAt = new Date().toISOString();
130
+ break;
131
+ case "blocked":
132
+ this.status.phase = "blocked";
133
+ this.status.blockedAt = new Date().toISOString();
134
+ break;
135
+ case "changes_requested":
136
+ this.status.phase = "changes_requested";
137
+ break;
138
+ }
139
+ this.save();
140
+ }
141
+ /**
142
+ * Record code files written
143
+ */
144
+ setCodeFiles(files) {
145
+ if (!this.status)
146
+ return;
147
+ this.status.codeFiles = files;
148
+ this.save();
149
+ }
150
+ /**
151
+ * Record requested changes
152
+ */
153
+ setChangesRequested(changes) {
154
+ if (!this.status)
155
+ return;
156
+ this.status.changesRequested = changes;
157
+ this.save();
158
+ }
159
+ /**
160
+ * Get current phase
161
+ */
162
+ getPhase() {
163
+ return this.status?.phase ?? "idle";
164
+ }
165
+ /**
166
+ * Get iteration number
167
+ */
168
+ getIteration() {
169
+ return this.status?.iteration ?? 0;
170
+ }
171
+ /**
172
+ * Check if build is allowed
173
+ */
174
+ canBuild() {
175
+ return this.status?.phase === "approved";
176
+ }
177
+ /**
178
+ * Get blackboard directory path
179
+ */
180
+ getPath() {
181
+ return this.dir;
182
+ }
183
+ /**
184
+ * Reset to idle
185
+ */
186
+ reset() {
187
+ if (!this.status)
188
+ return;
189
+ this.status.phase = "idle";
190
+ this.status.writerDone = false;
191
+ this.status.verdict = undefined;
192
+ this.status.verdictMessage = undefined;
193
+ this.status.reviewerStarted = undefined;
194
+ this.status.approvedAt = undefined;
195
+ this.status.blockedAt = undefined;
196
+ this.status.codeFiles = undefined;
197
+ this.status.changesRequested = undefined;
198
+ this.save();
199
+ }
200
+ /**
201
+ * Check if a review session exists for this project
202
+ */
203
+ exists() {
204
+ const path = join(this.dir, STATUS_FILE);
205
+ return existsSync(path);
206
+ }
207
+ /**
208
+ * Export status as markdown for display.
209
+ * Injected into every agent prompt so each agent sees the shared scoreboard.
210
+ * Matches the pi-lens pattern: persistent artifact encountered naturally.
211
+ */
212
+ toMarkdown() {
213
+ if (!this.status)
214
+ return "No active write-review session.";
215
+ const { phase, iteration, verdict, verdictMessage, codeFiles, changesRequested, } = this.status;
216
+ const verdictIcon = verdict === "approved"
217
+ ? "✅"
218
+ : verdict === "blocked"
219
+ ? "⛔"
220
+ : verdict === "changes_requested"
221
+ ? "🔄"
222
+ : "⏳";
223
+ const lines = [
224
+ `## Write-Review Scoreboard`,
225
+ ``,
226
+ `| Field | Value |`,
227
+ `|-------|-------|`,
228
+ `| Phase | ${verdictIcon} ${phase} |`,
229
+ `| Iteration | ${iteration} |`,
230
+ `| Verdict | ${verdict ?? "(none yet)"} |`,
231
+ ];
232
+ if (verdictMessage) {
233
+ lines.push(`| Summary | ${verdictMessage} |`);
234
+ }
235
+ if (codeFiles && codeFiles.length > 0) {
236
+ lines.push(``, `### Code Files Written`);
237
+ for (const file of codeFiles) {
238
+ lines.push(`- ${file}`);
239
+ }
240
+ }
241
+ if (changesRequested && changesRequested.length > 0) {
242
+ lines.push(``, `### Changes Requested (${changesRequested.length})`);
243
+ for (const change of changesRequested) {
244
+ lines.push(`- ${change}`);
245
+ }
246
+ }
247
+ return lines.join("\n");
248
+ }
249
+ /**
250
+ * Extract file paths from a fenced code block string.
251
+ * Looks for common patterns: ```path/to/file
252
+ */
253
+ extractFilePaths(code) {
254
+ const files = new Set();
255
+ // Match ```<whitespace>path (with optional language tag)
256
+ const fencedRe = /^```(?:\w+)?\s+([^\n]+)/gm;
257
+ let match;
258
+ while ((match = fencedRe.exec(code)) !== null) {
259
+ const path = match[1].trim();
260
+ // Skip if it looks like a filename with spaces (not a path)
261
+ if (path &&
262
+ !path.includes(" ") &&
263
+ (path.includes("/") ||
264
+ path.includes("\\") ||
265
+ path.endsWith(".ts") ||
266
+ path.endsWith(".js") ||
267
+ path.endsWith(".tsx") ||
268
+ path.endsWith(".json") ||
269
+ path.endsWith(".md"))) {
270
+ files.add(path);
271
+ }
272
+ }
273
+ return [...files];
274
+ }
275
+ }
276
+ /**
277
+ * Create or get blackboard for project
278
+ */
279
+ export function createBlackboard(projectPath, dir) {
280
+ const bb = new WriteReviewBlackboard(projectPath, dir);
281
+ if (bb.exists()) {
282
+ bb.load();
283
+ }
284
+ else {
285
+ bb.init();
286
+ }
287
+ return bb;
288
+ }
289
+ //# sourceMappingURL=blackboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blackboard.js","sourceRoot":"","sources":["../src/blackboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Ping-Pong Event Bus
3
+ *
4
+ * Lightweight event bus for two-agent coordination.
5
+ * Watches blackboard status.json for state changes.
6
+ * Emits events and notifies agents via ExtensionAPI.
7
+ *
8
+ * NO AI NEEDED - deterministic file watching + state machine.
9
+ */
10
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
11
+ /**
12
+ * Ping-Pong Events
13
+ */
14
+ export declare enum PingPongEvent {
15
+ SESSION_STARTED = "session_started",
16
+ WRITING_STARTED = "writing_started",
17
+ WRITER_DONE = "writer_done",
18
+ REVIEW_NEEDED = "review_needed",
19
+ REVIEW_STARTED = "review_started",
20
+ REVIEW_COMPLETE = "review_complete",
21
+ APPROVED = "approved",
22
+ CHANGES_REQUESTED = "changes_requested",
23
+ BLOCKED = "blocked",
24
+ SESSION_ENDED = "session_ended"
25
+ }
26
+ /**
27
+ * Event payload
28
+ */
29
+ export interface PingPongEventPayload {
30
+ event: PingPongEvent;
31
+ phase: string;
32
+ iteration: number;
33
+ timestamp: string;
34
+ data?: Record<string, unknown>;
35
+ }
36
+ /**
37
+ * Event listener callback
38
+ */
39
+ export type PingPongListener = (payload: PingPongEventPayload) => void | Promise<void>;
40
+ /**
41
+ * Simple Event Bus for ping-pong coordination
42
+ */
43
+ export declare class PingPongEventBus {
44
+ private listeners;
45
+ private watchers;
46
+ private lastStatusHash;
47
+ private pi;
48
+ private projectPath;
49
+ /**
50
+ * Register an event listener
51
+ */
52
+ on(event: PingPongEvent, listener: PingPongListener): () => void;
53
+ /**
54
+ * Register a listener for all events
55
+ */
56
+ onAny(listener: PingPongListener): () => void;
57
+ /**
58
+ * Emit an event
59
+ */
60
+ private emit;
61
+ /**
62
+ * Notify agents via ExtensionAPI
63
+ */
64
+ private notifyAgents;
65
+ /**
66
+ * Start watching a blackboard status.json
67
+ */
68
+ startWatching(blackboardPath: string): void;
69
+ /**
70
+ * Read status.json and emit events if changed
71
+ */
72
+ private readAndEmit;
73
+ /**
74
+ * Stop watching
75
+ */
76
+ stopWatching(): void;
77
+ /**
78
+ * Set ExtensionAPI for notifications
79
+ */
80
+ setExtensionAPI(pi: ExtensionAPI): void;
81
+ /**
82
+ * Get current status hash
83
+ */
84
+ getLastStatusHash(): string | null;
85
+ /**
86
+ * Clean up
87
+ */
88
+ destroy(): void;
89
+ }
90
+ /**
91
+ * Get global event bus instance
92
+ */
93
+ export declare function getPingPongEventBus(): PingPongEventBus;
94
+ /**
95
+ * Create a new event bus instance
96
+ */
97
+ export declare function createPingPongEventBus(): PingPongEventBus;
98
+ /**
99
+ * Helper: Check if status changed from previous
100
+ */
101
+ export declare function hasStatusChanged(current: Record<string, unknown>, previous: string | null): boolean;
102
+ /**
103
+ * Helper: Format event for logging
104
+ */
105
+ export declare function formatPingPongEvent(event: PingPongEventPayload): string;
106
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE;;GAEG;AACH,oBAAY,aAAa;IACvB,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IACnC,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,QAAQ,aAAa;IACrB,iBAAiB,sBAAsB;IACvC,OAAO,YAAY;IACnB,aAAa,kBAAkB;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAevF;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAwD;IACzE,OAAO,CAAC,QAAQ,CAAoD;IACpE,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,WAAW,CAAuB;IAE1C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAU/D;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAgB5C;IAED;;OAEG;IACH,OAAO,CAAC,IAAI;IAkCZ;;OAEG;IACH,OAAO,CAAC,YAAY;IAyCpB;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CA4B1C;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;IAmDnB;;OAEG;IACH,YAAY,IAAI,IAAI,CAMnB;IAED;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAEtC;IAED;;OAEG;IACH,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjC;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAId;CACF;AAKD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAST;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAEvE"}