@bbigbang/core 0.1.0

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 (175) hide show
  1. package/dist/config.js +380 -0
  2. package/dist/execution/executionDispatcher.js +3810 -0
  3. package/dist/main.js +90 -0
  4. package/dist/nodeEventHistory.js +206 -0
  5. package/dist/scheduler/dreamLogic.js +50 -0
  6. package/dist/scheduler/dreamScheduler.js +65 -0
  7. package/dist/services/agentFileAccessService.js +1913 -0
  8. package/dist/services/agentRuntimeCleanupBroker.js +62 -0
  9. package/dist/services/agentSkillsBroker.js +118 -0
  10. package/dist/services/agentSkillsService.js +83 -0
  11. package/dist/services/agentWorkspaceBroker.js +937 -0
  12. package/dist/services/agentWorkspaceService.js +70 -0
  13. package/dist/services/appVersion.js +14 -0
  14. package/dist/services/auth.js +586 -0
  15. package/dist/services/claudeControlBroker.js +154 -0
  16. package/dist/services/claudeTranscriptBroker.js +100 -0
  17. package/dist/services/claudeTranscriptService.js +359 -0
  18. package/dist/services/codexAppServerBroker.js +155 -0
  19. package/dist/services/codexTranscriptBroker.js +98 -0
  20. package/dist/services/codexTranscriptService.js +961 -0
  21. package/dist/services/droidMissionBroker.js +124 -0
  22. package/dist/services/droidMissionImporter.js +630 -0
  23. package/dist/services/droidModelOptions.js +165 -0
  24. package/dist/services/hubServerRegistrationService.js +268 -0
  25. package/dist/services/libraryManifest.js +43 -0
  26. package/dist/services/libraryScaffold.js +26 -0
  27. package/dist/services/libraryService.js +2263 -0
  28. package/dist/services/memoryService.js +386 -0
  29. package/dist/services/missionEvidence.js +377 -0
  30. package/dist/services/missionService.js +2361 -0
  31. package/dist/services/missionTrace.js +158 -0
  32. package/dist/services/nativeMissionBriefParser.js +120 -0
  33. package/dist/services/nativeMissionOrchestrator.js +2045 -0
  34. package/dist/services/nativeMissionReportGenerator.js +227 -0
  35. package/dist/services/nativeMissionValidationRunner.js +452 -0
  36. package/dist/services/nativeMissionWorkerBroker.js +190 -0
  37. package/dist/services/nodeRegistry.js +34 -0
  38. package/dist/services/nodeStateReconciler.js +97 -0
  39. package/dist/services/panelMediaScanner.js +119 -0
  40. package/dist/services/persistentRuntimeJsonlClient.js +153 -0
  41. package/dist/services/platformAgentPolicy.js +180 -0
  42. package/dist/services/platformAgentService.js +2041 -0
  43. package/dist/services/projectAccessResolver.js +93 -0
  44. package/dist/services/projectService.js +392 -0
  45. package/dist/services/resourceSpaceService.js +140 -0
  46. package/dist/services/scenarioRuntimeService.js +1130 -0
  47. package/dist/services/suggestedPlannerService.js +868 -0
  48. package/dist/services/workbenchGitBroker.js +161 -0
  49. package/dist/services/workbenchGitService.js +69 -0
  50. package/dist/services/workbenchInspectBroker.js +65 -0
  51. package/dist/services/workbenchNodePathService.js +79 -0
  52. package/dist/services/workbenchRegistryService.js +240 -0
  53. package/dist/services/workbenchRootService.js +181 -0
  54. package/dist/services/workbenchTerminalBroker.js +378 -0
  55. package/dist/services/workspaceRunOwnership.js +60 -0
  56. package/dist/services/workspaceScaffold.js +105 -0
  57. package/dist/services/workspaceSessionRuntimeService.js +576 -0
  58. package/dist/services/workspaceSessionService.js +245 -0
  59. package/dist/services/workspaceToolActionRunner.js +1582 -0
  60. package/dist/services/workspaceToolErrors.js +10 -0
  61. package/dist/services/workspaceToolExecutionUtils.js +895 -0
  62. package/dist/services/workspaceToolLatestStateProjector.js +91 -0
  63. package/dist/services/workspaceToolManifest.js +572 -0
  64. package/dist/services/workspaceToolMutationQueue.js +43 -0
  65. package/dist/services/workspaceToolPanelProjection.js +460 -0
  66. package/dist/services/workspaceToolPromotion.js +255 -0
  67. package/dist/services/workspaceToolPromotionState.js +224 -0
  68. package/dist/services/workspaceToolPublishDiagnostics.js +189 -0
  69. package/dist/services/workspaceToolPublishIdentityResolver.js +146 -0
  70. package/dist/services/workspaceToolReadModel.js +378 -0
  71. package/dist/services/workspaceToolRunLedger.js +239 -0
  72. package/dist/services/workspaceToolService.js +3067 -0
  73. package/dist/services/workspaceToolSnapshotPanelSync.js +293 -0
  74. package/dist/services/workspaceToolTerminalLifecycle.js +283 -0
  75. package/dist/services/workspaceToolTypes.js +1 -0
  76. package/dist/services/workspaceToolUploadMaterializer.js +228 -0
  77. package/dist/web/actionCardRoutes.js +129 -0
  78. package/dist/web/actionCards.js +469 -0
  79. package/dist/web/activationContext.js +684 -0
  80. package/dist/web/agentChannelGuards.js +48 -0
  81. package/dist/web/agentMentionCooldowns.js +32 -0
  82. package/dist/web/agentReminders.js +1668 -0
  83. package/dist/web/agentRuntimePresence.js +197 -0
  84. package/dist/web/agentSelfState.js +494 -0
  85. package/dist/web/agentTaskLinks.js +26 -0
  86. package/dist/web/agentVisibility.js +79 -0
  87. package/dist/web/assets.js +95 -0
  88. package/dist/web/channelActivationPrompt.js +395 -0
  89. package/dist/web/channelMemoryNotes.js +127 -0
  90. package/dist/web/channelMentions.js +10 -0
  91. package/dist/web/channelMessageSequences.js +19 -0
  92. package/dist/web/channelSubscriptions.js +26 -0
  93. package/dist/web/clearedTaskRoots.js +10 -0
  94. package/dist/web/collaborationPromptGuidance.js +36 -0
  95. package/dist/web/collaborationSurfaceState.js +140 -0
  96. package/dist/web/contextBundleRanking.js +154 -0
  97. package/dist/web/contextBundleResolver.js +488 -0
  98. package/dist/web/conversationBuiltinSkillRoots.js +50 -0
  99. package/dist/web/conversationControls.js +232 -0
  100. package/dist/web/conversationHandoffs.js +612 -0
  101. package/dist/web/conversationManager.js +2511 -0
  102. package/dist/web/conversationSummaries.js +876 -0
  103. package/dist/web/conversationSurfaceKinds.js +17 -0
  104. package/dist/web/conversationTargets.js +173 -0
  105. package/dist/web/directActivationPrompt.js +122 -0
  106. package/dist/web/directReplyTargets.js +69 -0
  107. package/dist/web/directThreadResolver.js +129 -0
  108. package/dist/web/dmTaskHandoffPrompt.js +120 -0
  109. package/dist/web/dmTaskThreadStatusProjection.js +229 -0
  110. package/dist/web/ftsQuery.js +33 -0
  111. package/dist/web/internalAgentRouter.js +11341 -0
  112. package/dist/web/libraryCuratorScheduler.js +58 -0
  113. package/dist/web/libraryDocumentPromptGuidance.js +8 -0
  114. package/dist/web/messageCheckpoints.js +19 -0
  115. package/dist/web/nodeWsHandler.js +2495 -0
  116. package/dist/web/notificationRounds.js +1061 -0
  117. package/dist/web/panelActionMessages.js +108 -0
  118. package/dist/web/panelActivationPrompt.js +18 -0
  119. package/dist/web/panelAudit.js +273 -0
  120. package/dist/web/panelLifecycle.js +222 -0
  121. package/dist/web/panelMediaPolicy.js +43 -0
  122. package/dist/web/panelPathPolicy.js +63 -0
  123. package/dist/web/panelPreviews.js +175 -0
  124. package/dist/web/panelQueryHandles.js +2749 -0
  125. package/dist/web/panelRoutes.js +2147 -0
  126. package/dist/web/panels.js +904 -0
  127. package/dist/web/peerInboxAggregates.js +1247 -0
  128. package/dist/web/planApprovalState.js +92 -0
  129. package/dist/web/platformAgentScheduler.js +66 -0
  130. package/dist/web/proactiveOpportunities.js +452 -0
  131. package/dist/web/promptContextSections.js +242 -0
  132. package/dist/web/promptHistorySanitizer.js +26 -0
  133. package/dist/web/promptSlashCommands.js +158 -0
  134. package/dist/web/rollingConversationSummary.js +453 -0
  135. package/dist/web/routeHelpers.js +11 -0
  136. package/dist/web/routes/handoff.js +288 -0
  137. package/dist/web/routes/history.js +345 -0
  138. package/dist/web/routes/memory.js +258 -0
  139. package/dist/web/routes/selfState.js +171 -0
  140. package/dist/web/routes/workspace.js +154 -0
  141. package/dist/web/runSurfaceWatermarks.js +431 -0
  142. package/dist/web/runtimeCapabilities.js +48 -0
  143. package/dist/web/sameAgentHandoffs.js +494 -0
  144. package/dist/web/server.js +15567 -0
  145. package/dist/web/sharedCollaborationCapsules.js +163 -0
  146. package/dist/web/soloSessionRelay.js +42 -0
  147. package/dist/web/soloWsHandler.js +138 -0
  148. package/dist/web/suggestedPlannerScheduler.js +56 -0
  149. package/dist/web/surfaceActivationPolicy.js +108 -0
  150. package/dist/web/surfaceCollaborators.js +61 -0
  151. package/dist/web/surfaceSystemStatus.js +263 -0
  152. package/dist/web/targetParticipants.js +77 -0
  153. package/dist/web/taskEvents.js +49 -0
  154. package/dist/web/taskLifecycleMessages.js +165 -0
  155. package/dist/web/taskLoops.js +732 -0
  156. package/dist/web/taskMemoryNotes.js +224 -0
  157. package/dist/web/taskNumbers.js +16 -0
  158. package/dist/web/taskOwnerGuards.js +49 -0
  159. package/dist/web/taskParticipantResolver.js +42 -0
  160. package/dist/web/taskParticipants.js +97 -0
  161. package/dist/web/taskSourceDetails.js +20 -0
  162. package/dist/web/taskStateViews.js +210 -0
  163. package/dist/web/taskStatusTransitions.js +9 -0
  164. package/dist/web/taskThreadFollowups.js +599 -0
  165. package/dist/web/taskThreadRuntimeClosure.js +685 -0
  166. package/dist/web/taskUpdateDelivery.js +104 -0
  167. package/dist/web/threadReplyContentHeuristics.js +30 -0
  168. package/dist/web/threadRoots.js +61 -0
  169. package/dist/web/threadTaskBindings.js +365 -0
  170. package/dist/web/uiPanelPromptGuidance.js +27 -0
  171. package/dist/web/workspaceMemoryHints.js +143 -0
  172. package/dist/web/workspaceToolPromptGuidance.js +30 -0
  173. package/dist/web/wsHandler.js +397 -0
  174. package/dist/web/wsSink.js +116 -0
  175. package/package.json +54 -0
@@ -0,0 +1,377 @@
1
+ const PREVIEW_LIMIT = 500;
2
+ export function deriveMissionEvidence(input) {
3
+ const { mission } = input;
4
+ const evidence = [
5
+ ...input.events.map((event) => deriveEventEvidence(mission, event)),
6
+ ...input.attempts.map((attempt) => deriveAttemptEvidence(mission, attempt)),
7
+ ...deriveSnapshotEvidence(mission, input.snapshot),
8
+ ...input.features.map((feature) => deriveFeatureEvidence(mission, feature)),
9
+ ...input.assertions.map((assertion) => deriveAssertionEvidence(mission, assertion)),
10
+ ...input.interactions.map((interaction) => deriveInteractionEvidence(mission, interaction)),
11
+ ];
12
+ evidence.sort((left, right) => {
13
+ if (left.eventTime !== right.eventTime)
14
+ return left.eventTime - right.eventTime;
15
+ return left.evidenceId.localeCompare(right.evidenceId);
16
+ });
17
+ return evidence;
18
+ }
19
+ export function filterMissionEvidence(evidence, filter) {
20
+ let result = evidence;
21
+ if (filter.sourceType) {
22
+ result = result.filter((item) => item.sourceType === filter.sourceType);
23
+ }
24
+ if (filter.featureId) {
25
+ result = result.filter((item) => item.featureId === filter.featureId);
26
+ }
27
+ if (typeof filter.after === 'number' && Number.isFinite(filter.after)) {
28
+ const after = filter.after;
29
+ result = result.filter((item) => item.eventTime > after);
30
+ }
31
+ if (typeof filter.limit === 'number' && Number.isFinite(filter.limit) && filter.limit > 0) {
32
+ const limit = filter.limit;
33
+ result = result.slice(0, Math.min(limit, 1_000));
34
+ }
35
+ return result;
36
+ }
37
+ function deriveEventEvidence(mission, event) {
38
+ const sourceType = 'mission_event';
39
+ const roleHint = inferRoleFromEvent(event);
40
+ const featureId = extractFeatureId(event.payload);
41
+ const preview = buildEventPreview(event);
42
+ return {
43
+ evidenceId: `${sourceType}:${event.eventId}`,
44
+ missionId: mission.missionId,
45
+ runtimeProvider: mission.runtimeProvider,
46
+ sourceType,
47
+ sourceRef: event.eventId,
48
+ eventTime: event.eventTime,
49
+ roleHint,
50
+ payloadPreview: preview,
51
+ payloadJson: {
52
+ eventId: event.eventId,
53
+ eventType: event.eventType,
54
+ source: event.source,
55
+ eventTime: event.eventTime,
56
+ createdAt: event.createdAt,
57
+ payload: event.payload,
58
+ },
59
+ featureId,
60
+ };
61
+ }
62
+ function deriveAttemptEvidence(mission, attempt) {
63
+ const sourceType = 'mission_attempt';
64
+ const roleHint = 'worker';
65
+ const preview = buildAttemptPreview(attempt);
66
+ return {
67
+ evidenceId: `${sourceType}:${attempt.attemptId}`,
68
+ missionId: mission.missionId,
69
+ runtimeProvider: mission.runtimeProvider,
70
+ sourceType,
71
+ sourceRef: attempt.attemptId,
72
+ eventTime: attempt.createdAt,
73
+ roleHint,
74
+ payloadPreview: preview,
75
+ payloadJson: {
76
+ attemptId: attempt.attemptId,
77
+ requestId: attempt.requestId,
78
+ attemptType: attempt.attemptType,
79
+ state: attempt.state,
80
+ nodeId: attempt.nodeId,
81
+ missionDir: attempt.missionDir,
82
+ promptPreview: attempt.promptPreview,
83
+ pid: attempt.pid,
84
+ exitCode: attempt.exitCode,
85
+ signal: attempt.signal,
86
+ error: attempt.error,
87
+ stdoutEventCount: attempt.stdoutEventCount,
88
+ stderrEventCount: attempt.stderrEventCount,
89
+ outputPreview: attempt.outputPreview,
90
+ supersededBy: attempt.supersededBy,
91
+ supersessionReason: attempt.supersessionReason,
92
+ supersededAt: attempt.supersededAt,
93
+ createdAt: attempt.createdAt,
94
+ acceptedAt: attempt.acceptedAt,
95
+ completedAt: attempt.completedAt,
96
+ },
97
+ featureId: null,
98
+ };
99
+ }
100
+ function deriveSnapshotEvidence(mission, snapshot) {
101
+ if (!snapshot)
102
+ return [];
103
+ const sourceType = 'mission_snapshot';
104
+ const roleHint = 'system';
105
+ const baseTime = snapshot.createdAt;
106
+ const snapshotData = snapshot.snapshot ?? {};
107
+ const evidence = [];
108
+ evidence.push({
109
+ evidenceId: `${sourceType}:${snapshot.snapshotId}:overview`,
110
+ missionId: mission.missionId,
111
+ runtimeProvider: mission.runtimeProvider,
112
+ sourceType,
113
+ sourceRef: snapshot.snapshotId,
114
+ eventTime: baseTime,
115
+ roleHint,
116
+ payloadPreview: truncatePreview(`Snapshot overview: ${JSON.stringify(snapshotData.overview ?? {})}`),
117
+ payloadJson: {
118
+ snapshotId: snapshot.snapshotId,
119
+ source: snapshot.source,
120
+ section: 'overview',
121
+ overview: snapshotData.overview ?? {},
122
+ },
123
+ featureId: null,
124
+ });
125
+ const featureItems = asRecordArray(snapshotData.features?.items);
126
+ for (const feature of featureItems) {
127
+ const featureId = typeof feature.id === 'string' ? feature.id : null;
128
+ evidence.push({
129
+ evidenceId: `${sourceType}:${snapshot.snapshotId}:feature:${featureId ?? evidence.length}`,
130
+ missionId: mission.missionId,
131
+ runtimeProvider: mission.runtimeProvider,
132
+ sourceType,
133
+ sourceRef: snapshot.snapshotId,
134
+ eventTime: baseTime,
135
+ roleHint,
136
+ payloadPreview: truncatePreview(`Feature [${feature.status ?? 'unknown'}]: ${feature.description ?? ''}`),
137
+ payloadJson: {
138
+ snapshotId: snapshot.snapshotId,
139
+ source: snapshot.source,
140
+ section: 'feature',
141
+ feature,
142
+ },
143
+ featureId,
144
+ });
145
+ }
146
+ const handoffItems = asRecordArray(snapshotData.handoffs?.items);
147
+ for (const handoff of handoffItems) {
148
+ const featureId = typeof handoff.featureId === 'string' ? handoff.featureId : null;
149
+ const summary = typeof handoff.salientSummary === 'string' ? handoff.salientSummary : '';
150
+ evidence.push({
151
+ evidenceId: `${sourceType}:${snapshot.snapshotId}:handoff:${featureId ?? evidence.length}`,
152
+ missionId: mission.missionId,
153
+ runtimeProvider: mission.runtimeProvider,
154
+ sourceType,
155
+ sourceRef: snapshot.snapshotId,
156
+ eventTime: baseTime,
157
+ roleHint,
158
+ payloadPreview: truncatePreview(`Handoff: ${summary}`),
159
+ payloadJson: {
160
+ snapshotId: snapshot.snapshotId,
161
+ source: snapshot.source,
162
+ section: 'handoff',
163
+ handoff,
164
+ },
165
+ featureId,
166
+ });
167
+ }
168
+ const assertionItems = asRecordArray(snapshotData.validation?.assertions);
169
+ for (const assertion of assertionItems) {
170
+ const featureId = typeof assertion.featureId === 'string' ? assertion.featureId : null;
171
+ const raw = asPlainObject(assertion.raw);
172
+ const text = typeof raw.assertionText === 'string' ? raw.assertionText : '';
173
+ evidence.push({
174
+ evidenceId: `${sourceType}:${snapshot.snapshotId}:assertion:${featureId ?? evidence.length}`,
175
+ missionId: mission.missionId,
176
+ runtimeProvider: mission.runtimeProvider,
177
+ sourceType,
178
+ sourceRef: snapshot.snapshotId,
179
+ eventTime: baseTime,
180
+ roleHint: 'validator',
181
+ payloadPreview: truncatePreview(`Assertion [${assertion.status ?? 'unknown'}]: ${text}`),
182
+ payloadJson: {
183
+ snapshotId: snapshot.snapshotId,
184
+ source: snapshot.source,
185
+ section: 'assertion',
186
+ assertion,
187
+ },
188
+ featureId,
189
+ });
190
+ }
191
+ const reportItems = asRecordArray(snapshotData.artifacts?.reports);
192
+ for (const report of reportItems) {
193
+ const reportPath = typeof report.path === 'string' ? report.path : '';
194
+ evidence.push({
195
+ evidenceId: `${sourceType}:${snapshot.snapshotId}:report:${reportPath || evidence.length}`,
196
+ missionId: mission.missionId,
197
+ runtimeProvider: mission.runtimeProvider,
198
+ sourceType,
199
+ sourceRef: snapshot.snapshotId,
200
+ eventTime: baseTime,
201
+ roleHint,
202
+ payloadPreview: truncatePreview(`Report: ${reportPath}`),
203
+ payloadJson: {
204
+ snapshotId: snapshot.snapshotId,
205
+ source: snapshot.source,
206
+ section: 'report',
207
+ report,
208
+ },
209
+ featureId: null,
210
+ });
211
+ }
212
+ return evidence;
213
+ }
214
+ function deriveFeatureEvidence(mission, feature) {
215
+ const sourceType = 'mission_feature';
216
+ const roleHint = 'worker';
217
+ return {
218
+ evidenceId: `${sourceType}:${feature.featureId}`,
219
+ missionId: mission.missionId,
220
+ runtimeProvider: mission.runtimeProvider,
221
+ sourceType,
222
+ sourceRef: feature.featureId,
223
+ eventTime: feature.createdAt,
224
+ roleHint,
225
+ payloadPreview: truncatePreview(`Feature [${feature.status}]: ${feature.description}`),
226
+ payloadJson: {
227
+ featureId: feature.featureId,
228
+ milestone: feature.milestone,
229
+ description: feature.description,
230
+ skillName: feature.skillName,
231
+ status: feature.status,
232
+ ordering: feature.ordering,
233
+ preconditions: feature.preconditions,
234
+ expectedBehavior: feature.expectedBehavior,
235
+ handoff: feature.handoff ?? null,
236
+ createdAt: feature.createdAt,
237
+ updatedAt: feature.updatedAt,
238
+ },
239
+ featureId: feature.featureId,
240
+ };
241
+ }
242
+ function deriveAssertionEvidence(mission, assertion) {
243
+ const sourceType = 'mission_assertion';
244
+ const roleHint = 'validator';
245
+ return {
246
+ evidenceId: `${sourceType}:${assertion.assertionId}`,
247
+ missionId: mission.missionId,
248
+ runtimeProvider: mission.runtimeProvider,
249
+ sourceType,
250
+ sourceRef: assertion.assertionId,
251
+ eventTime: assertion.createdAt,
252
+ roleHint,
253
+ payloadPreview: truncatePreview(`Assertion [${assertion.status}]: ${assertion.assertionText}`),
254
+ payloadJson: {
255
+ assertionId: assertion.assertionId,
256
+ featureId: assertion.featureId,
257
+ assertionText: assertion.assertionText,
258
+ status: assertion.status,
259
+ note: assertion.note,
260
+ evidence: assertion.evidence,
261
+ createdAt: assertion.createdAt,
262
+ updatedAt: assertion.updatedAt,
263
+ },
264
+ featureId: assertion.featureId,
265
+ };
266
+ }
267
+ function deriveInteractionEvidence(mission, interaction) {
268
+ const sourceType = 'mission_interaction';
269
+ const roleHint = 'user';
270
+ return {
271
+ evidenceId: `${sourceType}:${interaction.interactionId}`,
272
+ missionId: mission.missionId,
273
+ runtimeProvider: mission.runtimeProvider,
274
+ sourceType,
275
+ sourceRef: interaction.interactionId,
276
+ eventTime: interaction.createdAt,
277
+ roleHint,
278
+ payloadPreview: truncatePreview(`Interaction [${interaction.status}]: ${interaction.prompt}`),
279
+ payloadJson: {
280
+ interactionId: interaction.interactionId,
281
+ prompt: interaction.prompt,
282
+ status: interaction.status,
283
+ position: interaction.position,
284
+ createdAt: interaction.createdAt,
285
+ updatedAt: interaction.updatedAt,
286
+ },
287
+ featureId: null,
288
+ };
289
+ }
290
+ function inferRoleFromEvent(event) {
291
+ const type = event.eventType;
292
+ const source = event.source;
293
+ if (type.includes('validation'))
294
+ return 'validator';
295
+ if (type === 'mission_interaction_observed' || type === 'mission_interaction_applied')
296
+ return 'orchestrator';
297
+ if (type.startsWith('feature_')
298
+ || type.includes('worker')
299
+ || type === 'mission_stdout'
300
+ || type === 'mission_stderr'
301
+ || type === 'mission_worker_transcript') {
302
+ return 'worker';
303
+ }
304
+ if (type.includes('interaction') || type.includes('continue'))
305
+ return 'user';
306
+ if (type.startsWith('mission_')) {
307
+ if (type === 'mission_created' || type === 'mission_updated')
308
+ return 'system';
309
+ return 'orchestrator';
310
+ }
311
+ if (source === 'droid_cli')
312
+ return 'worker';
313
+ if (source === 'agent_node')
314
+ return 'worker';
315
+ if (source === 'platform')
316
+ return 'system';
317
+ return 'unknown';
318
+ }
319
+ function extractFeatureId(payload) {
320
+ if (!payload)
321
+ return null;
322
+ const value = payload.featureId;
323
+ return typeof value === 'string' ? value : null;
324
+ }
325
+ function buildEventPreview(event) {
326
+ const payload = event.payload ?? {};
327
+ let extra = '';
328
+ if (event.eventType === 'mission_stdout' || event.eventType === 'mission_stderr') {
329
+ const text = typeof payload.text === 'string' ? payload.text : '';
330
+ extra = text;
331
+ }
332
+ else if (event.eventType === 'mission_worker_transcript') {
333
+ const toolName = typeof payload.toolName === 'string' ? payload.toolName : 'unknown';
334
+ const kind = typeof payload.kind === 'string' ? payload.kind : 'transcript';
335
+ const content = typeof payload.content === 'string' ? payload.content : '';
336
+ extra = `[${kind}] ${toolName}: ${content}`;
337
+ }
338
+ else if (typeof payload.prompt === 'string' && payload.prompt) {
339
+ extra = payload.prompt;
340
+ }
341
+ else if (typeof payload.error === 'string' && payload.error) {
342
+ extra = payload.error;
343
+ }
344
+ else if (typeof payload.reason === 'string' && payload.reason) {
345
+ extra = payload.reason;
346
+ }
347
+ const base = `${event.eventType} (${event.source})`;
348
+ if (!extra)
349
+ return base;
350
+ return truncatePreview(`${base}: ${extra}`);
351
+ }
352
+ function buildAttemptPreview(attempt) {
353
+ const parts = [`${attempt.attemptType} attempt [${attempt.state}]`];
354
+ if (attempt.promptPreview)
355
+ parts.push(attempt.promptPreview);
356
+ if (attempt.outputPreview)
357
+ parts.push(attempt.outputPreview);
358
+ if (attempt.error)
359
+ parts.push(`error: ${attempt.error}`);
360
+ return truncatePreview(parts.join(' | '));
361
+ }
362
+ function truncatePreview(value, limit = PREVIEW_LIMIT) {
363
+ const collapsed = value.replace(/\s+/g, ' ').trim();
364
+ if (collapsed.length <= limit)
365
+ return collapsed;
366
+ return `${collapsed.slice(0, limit)}...`;
367
+ }
368
+ function asPlainObject(value) {
369
+ if (value && typeof value === 'object' && !Array.isArray(value))
370
+ return value;
371
+ return {};
372
+ }
373
+ function asRecordArray(value) {
374
+ if (!Array.isArray(value))
375
+ return [];
376
+ return value.filter((item) => item != null && typeof item === 'object' && !Array.isArray(item));
377
+ }