@pixelbyte-software/pixcode 1.54.11 → 1.55.1

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 (165) hide show
  1. package/dist/assets/{index-Bcqs_1vc.js → index-B-ySsQqi.js} +147 -147
  2. package/dist/assets/index-CWO38aJI.css +32 -0
  3. package/dist/index.html +2 -2
  4. package/dist-server/server/claude-sdk.js +1 -1
  5. package/dist-server/server/claude-sdk.js.map +1 -1
  6. package/dist-server/server/index.js +6 -11
  7. package/dist-server/server/index.js.map +1 -1
  8. package/dist-server/server/modules/security/permission-policy.js.map +1 -0
  9. package/dist-server/server/services/control-room.js +9 -1
  10. package/dist-server/server/services/control-room.js.map +1 -1
  11. package/dist-server/server/services/public-api-manifest.js +5 -5
  12. package/dist-server/server/services/public-api-manifest.js.map +1 -1
  13. package/dist-server/server/services/telegram/control-center.js +10 -10
  14. package/dist-server/server/services/telegram/control-center.js.map +1 -1
  15. package/dist-server/server/services/telegram/telegram-gateway.js +2 -2
  16. package/dist-server/server/services/telegram/telegram-gateway.js.map +1 -1
  17. package/dist-server/server/services/telegram/translations.js +5 -5
  18. package/dist-server/server/services/telegram/translations.js.map +1 -1
  19. package/package.json +1 -1
  20. package/server/claude-sdk.js +1 -1
  21. package/server/index.js +6 -23
  22. package/server/services/control-room.js +10 -1
  23. package/server/services/public-api-manifest.js +5 -5
  24. package/server/services/telegram/control-center.js +10 -10
  25. package/server/services/telegram/telegram-gateway.js +2 -2
  26. package/server/services/telegram/translations.js +5 -5
  27. package/dist/assets/index-Dz1luE0u.css +0 -32
  28. package/dist-server/server/modules/orchestration/a2a/adapter-registry.js +0 -73
  29. package/dist-server/server/modules/orchestration/a2a/adapter-registry.js.map +0 -1
  30. package/dist-server/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.js +0 -17
  31. package/dist-server/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.js.map +0 -1
  32. package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js +0 -236
  33. package/dist-server/server/modules/orchestration/a2a/adapters/claude-code.adapter.js.map +0 -1
  34. package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js +0 -202
  35. package/dist-server/server/modules/orchestration/a2a/adapters/codex.adapter.js.map +0 -1
  36. package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js +0 -205
  37. package/dist-server/server/modules/orchestration/a2a/adapters/cursor.adapter.js.map +0 -1
  38. package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js +0 -205
  39. package/dist-server/server/modules/orchestration/a2a/adapters/gemini.adapter.js.map +0 -1
  40. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.js +0 -84
  41. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.js.map +0 -1
  42. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.test.js +0 -43
  43. package/dist-server/server/modules/orchestration/a2a/adapters/json-event.adapter.test.js.map +0 -1
  44. package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js +0 -205
  45. package/dist-server/server/modules/orchestration/a2a/adapters/opencode.adapter.js.map +0 -1
  46. package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js +0 -205
  47. package/dist-server/server/modules/orchestration/a2a/adapters/qwen.adapter.js.map +0 -1
  48. package/dist-server/server/modules/orchestration/a2a/agent-card.js +0 -50
  49. package/dist-server/server/modules/orchestration/a2a/agent-card.js.map +0 -1
  50. package/dist-server/server/modules/orchestration/a2a/auth.middleware.js +0 -25
  51. package/dist-server/server/modules/orchestration/a2a/auth.middleware.js.map +0 -1
  52. package/dist-server/server/modules/orchestration/a2a/bus.js +0 -34
  53. package/dist-server/server/modules/orchestration/a2a/bus.js.map +0 -1
  54. package/dist-server/server/modules/orchestration/a2a/routes.js +0 -502
  55. package/dist-server/server/modules/orchestration/a2a/routes.js.map +0 -1
  56. package/dist-server/server/modules/orchestration/a2a/task-dispatcher.js +0 -295
  57. package/dist-server/server/modules/orchestration/a2a/task-dispatcher.js.map +0 -1
  58. package/dist-server/server/modules/orchestration/a2a/task-store.js +0 -144
  59. package/dist-server/server/modules/orchestration/a2a/task-store.js.map +0 -1
  60. package/dist-server/server/modules/orchestration/a2a/types.js +0 -6
  61. package/dist-server/server/modules/orchestration/a2a/types.js.map +0 -1
  62. package/dist-server/server/modules/orchestration/a2a/validator.js +0 -101
  63. package/dist-server/server/modules/orchestration/a2a/validator.js.map +0 -1
  64. package/dist-server/server/modules/orchestration/index.js +0 -27
  65. package/dist-server/server/modules/orchestration/index.js.map +0 -1
  66. package/dist-server/server/modules/orchestration/preview/port-watcher.js +0 -90
  67. package/dist-server/server/modules/orchestration/preview/port-watcher.js.map +0 -1
  68. package/dist-server/server/modules/orchestration/preview/preview-proxy.js +0 -58
  69. package/dist-server/server/modules/orchestration/preview/preview-proxy.js.map +0 -1
  70. package/dist-server/server/modules/orchestration/preview/types.js +0 -2
  71. package/dist-server/server/modules/orchestration/preview/types.js.map +0 -1
  72. package/dist-server/server/modules/orchestration/security/permission-policy.js.map +0 -1
  73. package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js +0 -34
  74. package/dist-server/server/modules/orchestration/tasks/orchestration-task-store.js.map +0 -1
  75. package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js +0 -70
  76. package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js.map +0 -1
  77. package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js +0 -181
  78. package/dist-server/server/modules/orchestration/tasks/orchestration-task.service.js.map +0 -1
  79. package/dist-server/server/modules/orchestration/tasks/orchestration-task.types.js +0 -2
  80. package/dist-server/server/modules/orchestration/tasks/orchestration-task.types.js.map +0 -1
  81. package/dist-server/server/modules/orchestration/tasks/task-run-graph.js +0 -100
  82. package/dist-server/server/modules/orchestration/tasks/task-run-graph.js.map +0 -1
  83. package/dist-server/server/modules/orchestration/workflows/approval-queue.js +0 -72
  84. package/dist-server/server/modules/orchestration/workflows/approval-queue.js.map +0 -1
  85. package/dist-server/server/modules/orchestration/workflows/built-in-workflows.js +0 -126
  86. package/dist-server/server/modules/orchestration/workflows/built-in-workflows.js.map +0 -1
  87. package/dist-server/server/modules/orchestration/workflows/context-packet.js +0 -89
  88. package/dist-server/server/modules/orchestration/workflows/context-packet.js.map +0 -1
  89. package/dist-server/server/modules/orchestration/workflows/handoff-artifact.js +0 -123
  90. package/dist-server/server/modules/orchestration/workflows/handoff-artifact.js.map +0 -1
  91. package/dist-server/server/modules/orchestration/workflows/workflow-fallback-policy.js +0 -114
  92. package/dist-server/server/modules/orchestration/workflows/workflow-fallback-policy.js.map +0 -1
  93. package/dist-server/server/modules/orchestration/workflows/workflow-replay.js +0 -177
  94. package/dist-server/server/modules/orchestration/workflows/workflow-replay.js.map +0 -1
  95. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js +0 -1718
  96. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js.map +0 -1
  97. package/dist-server/server/modules/orchestration/workflows/workflow-store.js +0 -76
  98. package/dist-server/server/modules/orchestration/workflows/workflow-store.js.map +0 -1
  99. package/dist-server/server/modules/orchestration/workflows/workflow-templates.js +0 -242
  100. package/dist-server/server/modules/orchestration/workflows/workflow-templates.js.map +0 -1
  101. package/dist-server/server/modules/orchestration/workflows/workflow-trace.js +0 -388
  102. package/dist-server/server/modules/orchestration/workflows/workflow-trace.js.map +0 -1
  103. package/dist-server/server/modules/orchestration/workflows/workflow.routes.js +0 -508
  104. package/dist-server/server/modules/orchestration/workflows/workflow.routes.js.map +0 -1
  105. package/dist-server/server/modules/orchestration/workflows/workflow.types.js +0 -2
  106. package/dist-server/server/modules/orchestration/workflows/workflow.types.js.map +0 -1
  107. package/dist-server/server/modules/orchestration/workflows/workspace-target.js +0 -100
  108. package/dist-server/server/modules/orchestration/workflows/workspace-target.js.map +0 -1
  109. package/dist-server/server/modules/orchestration/workspace/docker-workspace.js +0 -123
  110. package/dist-server/server/modules/orchestration/workspace/docker-workspace.js.map +0 -1
  111. package/dist-server/server/modules/orchestration/workspace/path-safety.js +0 -48
  112. package/dist-server/server/modules/orchestration/workspace/path-safety.js.map +0 -1
  113. package/dist-server/server/modules/orchestration/workspace/types.js +0 -11
  114. package/dist-server/server/modules/orchestration/workspace/types.js.map +0 -1
  115. package/dist-server/server/modules/orchestration/workspace/workspace-manager.js +0 -84
  116. package/dist-server/server/modules/orchestration/workspace/workspace-manager.js.map +0 -1
  117. package/dist-server/server/modules/orchestration/workspace/worktree-workspace.js +0 -97
  118. package/dist-server/server/modules/orchestration/workspace/worktree-workspace.js.map +0 -1
  119. package/server/modules/orchestration/a2a/adapter-registry.ts +0 -108
  120. package/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.ts +0 -63
  121. package/server/modules/orchestration/a2a/adapters/claude-code.adapter.ts +0 -286
  122. package/server/modules/orchestration/a2a/adapters/codex.adapter.ts +0 -244
  123. package/server/modules/orchestration/a2a/adapters/cursor.adapter.ts +0 -249
  124. package/server/modules/orchestration/a2a/adapters/gemini.adapter.ts +0 -248
  125. package/server/modules/orchestration/a2a/adapters/json-event.adapter.test.ts +0 -60
  126. package/server/modules/orchestration/a2a/adapters/json-event.adapter.ts +0 -101
  127. package/server/modules/orchestration/a2a/adapters/opencode.adapter.ts +0 -248
  128. package/server/modules/orchestration/a2a/adapters/qwen.adapter.ts +0 -248
  129. package/server/modules/orchestration/a2a/agent-card.ts +0 -55
  130. package/server/modules/orchestration/a2a/auth.middleware.ts +0 -29
  131. package/server/modules/orchestration/a2a/bus.ts +0 -46
  132. package/server/modules/orchestration/a2a/routes.ts +0 -586
  133. package/server/modules/orchestration/a2a/task-dispatcher.ts +0 -345
  134. package/server/modules/orchestration/a2a/task-store.ts +0 -178
  135. package/server/modules/orchestration/a2a/types.ts +0 -126
  136. package/server/modules/orchestration/a2a/validator.ts +0 -113
  137. package/server/modules/orchestration/index.ts +0 -99
  138. package/server/modules/orchestration/preview/port-watcher.ts +0 -112
  139. package/server/modules/orchestration/preview/preview-proxy.ts +0 -60
  140. package/server/modules/orchestration/preview/types.ts +0 -19
  141. package/server/modules/orchestration/tasks/orchestration-task-store.ts +0 -41
  142. package/server/modules/orchestration/tasks/orchestration-task.routes.ts +0 -81
  143. package/server/modules/orchestration/tasks/orchestration-task.service.ts +0 -201
  144. package/server/modules/orchestration/tasks/orchestration-task.types.ts +0 -40
  145. package/server/modules/orchestration/tasks/task-run-graph.ts +0 -155
  146. package/server/modules/orchestration/workflows/approval-queue.ts +0 -106
  147. package/server/modules/orchestration/workflows/built-in-workflows.ts +0 -127
  148. package/server/modules/orchestration/workflows/context-packet.ts +0 -186
  149. package/server/modules/orchestration/workflows/handoff-artifact.ts +0 -175
  150. package/server/modules/orchestration/workflows/workflow-fallback-policy.ts +0 -161
  151. package/server/modules/orchestration/workflows/workflow-replay.ts +0 -254
  152. package/server/modules/orchestration/workflows/workflow-runner.ts +0 -2062
  153. package/server/modules/orchestration/workflows/workflow-store.ts +0 -97
  154. package/server/modules/orchestration/workflows/workflow-templates.ts +0 -272
  155. package/server/modules/orchestration/workflows/workflow-trace.ts +0 -424
  156. package/server/modules/orchestration/workflows/workflow.routes.ts +0 -586
  157. package/server/modules/orchestration/workflows/workflow.types.ts +0 -111
  158. package/server/modules/orchestration/workflows/workspace-target.ts +0 -122
  159. package/server/modules/orchestration/workspace/docker-workspace.ts +0 -136
  160. package/server/modules/orchestration/workspace/path-safety.ts +0 -55
  161. package/server/modules/orchestration/workspace/types.ts +0 -52
  162. package/server/modules/orchestration/workspace/workspace-manager.ts +0 -102
  163. package/server/modules/orchestration/workspace/worktree-workspace.ts +0 -126
  164. /package/dist-server/server/modules/{orchestration/security → security}/permission-policy.js +0 -0
  165. /package/server/modules/{orchestration/security → security}/permission-policy.ts +0 -0
@@ -1,424 +0,0 @@
1
- import os from 'node:os';
2
-
3
- import type {
4
- WorkflowNodeRun,
5
- WorkflowRun,
6
- WorkflowTraceEvent,
7
- } from '@/modules/orchestration/workflows/workflow.types.js';
8
-
9
- const MAX_TRACE_TEXT_CHARS = 2_400;
10
- const TERMINAL_STATES = new Set(['completed', 'failed', 'canceled', 'skipped']);
11
-
12
- function traceId(parts: Array<string | number | undefined>): string {
13
- return parts.filter((part) => part !== undefined && part !== '').join(':');
14
- }
15
-
16
- function durationMs(startedAt?: number, finishedAt?: number): number | undefined {
17
- if (!startedAt || !finishedAt) return undefined;
18
- return Math.max(0, finishedAt - startedAt);
19
- }
20
-
21
- function readString(value: unknown): string | undefined {
22
- return typeof value === 'string' && value.trim() ? value : undefined;
23
- }
24
-
25
- function readRecord(value: unknown): Record<string, unknown> | undefined {
26
- return value && typeof value === 'object' ? value as Record<string, unknown> : undefined;
27
- }
28
-
29
- function redactionValues(run: WorkflowRun): string[] {
30
- const metadata = run.metadata ?? {};
31
- const workspaceTarget = metadata.workspaceTarget && typeof metadata.workspaceTarget === 'object'
32
- ? metadata.workspaceTarget as Record<string, unknown>
33
- : {};
34
-
35
- return [
36
- os.homedir(),
37
- readString(metadata.projectPath),
38
- readString(metadata.selectedProjectPath),
39
- readString(workspaceTarget.path),
40
- readString(workspaceTarget.projectPath),
41
- readString(workspaceTarget.selectedProjectPath),
42
- ].filter((value): value is string => Boolean(value && value.length > 2));
43
- }
44
-
45
- function escapeRegExp(value: string): string {
46
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
47
- }
48
-
49
- export function redactTraceText(value: string | undefined, run: WorkflowRun, maxLength = MAX_TRACE_TEXT_CHARS): string | undefined {
50
- if (!value?.trim()) return undefined;
51
-
52
- let text = value;
53
- for (const secret of redactionValues(run)) {
54
- text = text.replace(new RegExp(escapeRegExp(secret), 'g'), '[workspace]');
55
- }
56
-
57
- text = text
58
- .replace(/\b(?:sk|ghp|github_pat|glpat|npm)_[A-Za-z0-9_=-]{12,}\b/gu, '[redacted-token]')
59
- .replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/gu, '[redacted-email]')
60
- .trim();
61
-
62
- if (text.length <= maxLength) return text;
63
- return `${text.slice(0, maxLength - 32).trimEnd()}\n...[trace truncated]`;
64
- }
65
-
66
- function eventBase(
67
- node: WorkflowNodeRun | undefined,
68
- ): Pick<WorkflowTraceEvent, 'actor' | 'adapterId' | 'agentInstanceId' | 'agentLabel' | 'model' | 'nodeId'> {
69
- if (!node) {
70
- return { actor: 'Pixcode' };
71
- }
72
-
73
- return {
74
- actor: node.agentLabel || node.adapterId || node.nodeId,
75
- nodeId: node.nodeId,
76
- adapterId: node.adapterId,
77
- agentInstanceId: node.agentInstanceId,
78
- agentLabel: node.agentLabel,
79
- model: node.model,
80
- };
81
- }
82
-
83
- function pushEvent(
84
- events: WorkflowTraceEvent[],
85
- event: WorkflowTraceEvent,
86
- ): void {
87
- events.push(event);
88
- }
89
-
90
- function artifactTitleKey(type: string): string {
91
- if (type === 'file-diff') return 'workflow.trace.fileChanged';
92
- if (type === 'preview-url') return 'workflow.trace.previewReady';
93
- if (type === 'command-output') return 'workflow.trace.commandOutput';
94
- if (type === 'handoff-artifact') return 'workflow.trace.handoffArtifact';
95
- return 'workflow.trace.artifact';
96
- }
97
-
98
- function artifactType(type: string): WorkflowTraceEvent['type'] {
99
- return type === 'file-diff' ? 'file' : 'artifact';
100
- }
101
-
102
- function artifactTitle(type: string): string {
103
- if (type === 'file-diff') return 'File changes captured';
104
- if (type === 'preview-url') return 'Preview output captured';
105
- if (type === 'command-output') return 'Command output captured';
106
- if (type === 'handoff-artifact') return 'Handoff artifact captured';
107
- return 'Artifact captured';
108
- }
109
-
110
- function artifactSummary(
111
- artifact: NonNullable<WorkflowNodeRun['artifacts']>[number],
112
- run: WorkflowRun,
113
- ): string | undefined {
114
- if (artifact.text?.trim()) {
115
- return redactTraceText(artifact.text, run);
116
- }
117
- if (artifact.data && Object.keys(artifact.data).length > 0) {
118
- return redactTraceText(JSON.stringify(artifact.data, null, 2), run);
119
- }
120
- return artifact.type;
121
- }
122
-
123
- function nodeTimestamp(run: WorkflowRun, node: WorkflowNodeRun, index: number): number {
124
- return node.startedAt ?? run.startedAt + index;
125
- }
126
-
127
- export function buildWorkflowTrace(run: WorkflowRun): WorkflowTraceEvent[] {
128
- const events: WorkflowTraceEvent[] = [];
129
-
130
- pushEvent(events, {
131
- id: traceId([run.id, 'run-started']),
132
- type: 'run',
133
- severity: 'info',
134
- status: run.status,
135
- timestamp: run.startedAt,
136
- durationMs: durationMs(run.startedAt, run.finishedAt),
137
- actor: 'Pixcode',
138
- title: 'Workflow run started',
139
- titleKey: 'workflow.trace.runStarted',
140
- summary: redactTraceText(run.input, run),
141
- metadata: {
142
- workflowId: run.workflowId,
143
- contextId: run.contextId,
144
- },
145
- });
146
-
147
- const replay = readRecord(run.metadata?.replay);
148
- if (replay) {
149
- pushEvent(events, {
150
- id: traceId([run.id, 'replay']),
151
- type: 'run',
152
- severity: replay.requiresApproval ? 'warning' : 'info',
153
- status: run.status,
154
- timestamp: run.startedAt + 0.25,
155
- actor: 'Pixcode',
156
- title: 'Workflow replay prepared',
157
- titleKey: 'workflow.trace.replay',
158
- summary: redactTraceText([
159
- `Source run: ${readString(replay.sourceRunId) ?? 'unknown'}`,
160
- `Scope: ${readString(replay.scope) ?? 'unknown'}`,
161
- Array.isArray(replay.selectedNodeIds) ? `Selected steps: ${replay.selectedNodeIds.join(', ')}` : undefined,
162
- replay.requiresApproval ? 'Replay required approval for prior shell, network, or file-write activity.' : undefined,
163
- ].filter(Boolean).join('\n'), run),
164
- metadata: replay,
165
- });
166
- }
167
-
168
- const workflowTemplate = readRecord(run.metadata?.workflowTemplate);
169
- if (workflowTemplate) {
170
- pushEvent(events, {
171
- id: traceId([run.id, 'workflow-template']),
172
- type: 'run',
173
- severity: 'info',
174
- status: run.status,
175
- timestamp: run.startedAt + 0.3,
176
- actor: 'Pixcode',
177
- title: 'Workflow template applied',
178
- titleKey: 'workflow.trace.template',
179
- summary: redactTraceText([
180
- `Template: ${readString(workflowTemplate.name) ?? readString(workflowTemplate.id) ?? 'unknown'}`,
181
- `Protocol: ${readString(workflowTemplate.protocol) ?? 'unknown'}`,
182
- Array.isArray(workflowTemplate.acceptanceCriteria)
183
- ? `Acceptance criteria:\n- ${workflowTemplate.acceptanceCriteria.filter((item) => typeof item === 'string').join('\n- ')}`
184
- : undefined,
185
- ].filter(Boolean).join('\n'), run),
186
- metadata: workflowTemplate,
187
- });
188
- }
189
-
190
- const fallbackEvents = Array.isArray(run.metadata?.fallbackEvents)
191
- ? run.metadata.fallbackEvents
192
- : [];
193
- fallbackEvents.forEach((event, index) => {
194
- const record = readRecord(event);
195
- if (!record) return;
196
- pushEvent(events, {
197
- id: traceId([run.id, 'fallback', index]),
198
- type: 'node',
199
- severity: 'warning',
200
- status: 'submitted',
201
- timestamp: typeof record.startedAt === 'number' ? record.startedAt : run.startedAt + 0.5 + index,
202
- actor: 'Pixcode',
203
- nodeId: readString(record.nodeId),
204
- title: 'Fallback agent started',
205
- titleKey: 'workflow.trace.fallback',
206
- summary: redactTraceText([
207
- `Trigger: ${readString(record.trigger) ?? 'unknown'}`,
208
- `Source node: ${readString(record.nodeId) ?? 'unknown'}`,
209
- `Fallback node: ${readString(record.fallbackNodeId) ?? 'unknown'}`,
210
- readString(record.reason) ? `Reason: ${readString(record.reason)}` : undefined,
211
- ].filter(Boolean).join('\n'), run),
212
- metadata: record,
213
- });
214
- });
215
-
216
- const fallbackSkippedEvents = Array.isArray(run.metadata?.fallbackSkippedEvents)
217
- ? run.metadata.fallbackSkippedEvents
218
- : [];
219
- fallbackSkippedEvents.forEach((event, index) => {
220
- const record = readRecord(event);
221
- if (!record) return;
222
- pushEvent(events, {
223
- id: traceId([run.id, 'fallback-skipped', index]),
224
- type: 'node',
225
- severity: 'info',
226
- status: 'skipped',
227
- timestamp: typeof record.createdAt === 'number' ? record.createdAt : run.startedAt + 0.75 + index,
228
- actor: 'Pixcode',
229
- nodeId: readString(record.nodeId),
230
- title: 'Fallback skipped',
231
- titleKey: 'workflow.trace.fallback',
232
- summary: redactTraceText([
233
- `Trigger: ${readString(record.trigger) ?? 'unknown'}`,
234
- `Skipped: ${readString(record.skippedReason) ?? 'policy did not allow fallback'}`,
235
- readString(record.reason) ? `Reason: ${readString(record.reason)}` : undefined,
236
- ].filter(Boolean).join('\n'), run),
237
- metadata: record,
238
- });
239
- });
240
-
241
- const permissionPolicyEvents = Array.isArray(run.metadata?.permissionPolicyEvents)
242
- ? run.metadata.permissionPolicyEvents
243
- : [];
244
- permissionPolicyEvents.forEach((event, index) => {
245
- const record = readRecord(event);
246
- if (!record) return;
247
- const behavior = readString(record.behavior);
248
- const capabilities = Array.isArray(record.capabilities)
249
- ? record.capabilities.filter((item): item is string => typeof item === 'string')
250
- : [];
251
- pushEvent(events, {
252
- id: traceId([run.id, 'permission-policy', readString(record.id) ?? index]),
253
- type: 'permission_policy',
254
- severity: behavior === 'deny' ? 'error' : behavior === 'prompt' ? 'warning' : 'info',
255
- status: behavior === 'deny' ? 'failed' : behavior === 'prompt' ? 'submitted' : 'completed',
256
- timestamp: typeof record.createdAt === 'number' ? record.createdAt : run.startedAt + 0.85 + index,
257
- actor: 'Pixcode',
258
- nodeId: readString(record.nodeId),
259
- adapterId: readString(record.adapterId),
260
- agentLabel: readString(record.agentLabel),
261
- title: 'Permission policy decision',
262
- titleKey: 'workflow.trace.permissionPolicy',
263
- summary: redactTraceText([
264
- `Decision: ${behavior ?? readString(record.status) ?? 'unknown'}`,
265
- capabilities.length > 0 ? `Capabilities: ${capabilities.join(', ')}` : undefined,
266
- readString(record.summary),
267
- readString(record.message),
268
- ].filter(Boolean).join('\n'), run),
269
- metadata: record,
270
- });
271
- });
272
-
273
- run.nodeRuns.forEach((node, index) => {
274
- const base = eventBase(node);
275
- const timestamp = nodeTimestamp(run, node, index);
276
- const nodeDuration = durationMs(node.startedAt, node.finishedAt);
277
-
278
- pushEvent(events, {
279
- id: traceId([run.id, node.nodeId, 'node']),
280
- type: 'node',
281
- severity: node.status === 'failed' ? 'error' : 'info',
282
- status: node.status,
283
- timestamp,
284
- durationMs: nodeDuration,
285
- ...base,
286
- title: TERMINAL_STATES.has(node.status) ? 'Workflow step finished' : 'Workflow step started',
287
- titleKey: TERMINAL_STATES.has(node.status) ? 'workflow.trace.nodeFinished' : 'workflow.trace.nodeStarted',
288
- summary: redactTraceText(node.assignment, run),
289
- metadata: {
290
- stage: node.stage,
291
- internal: node.internal,
292
- },
293
- });
294
-
295
- if (node.promptPreview) {
296
- pushEvent(events, {
297
- id: traceId([run.id, node.nodeId, 'prompt']),
298
- type: 'message',
299
- severity: 'info',
300
- status: node.status,
301
- timestamp: timestamp + 1,
302
- ...base,
303
- title: 'Prompt prepared',
304
- titleKey: 'workflow.trace.prompt',
305
- summary: redactTraceText(node.promptPreview, run),
306
- });
307
- }
308
-
309
- if (node.contextPacket) {
310
- pushEvent(events, {
311
- id: traceId([run.id, node.nodeId, 'context-packet']),
312
- type: 'message',
313
- severity: node.contextPacket.compaction.wasCompacted ? 'warning' : 'info',
314
- status: node.status,
315
- timestamp: timestamp + 1.5,
316
- ...base,
317
- title: 'Context packet prepared',
318
- titleKey: 'workflow.trace.contextPacket',
319
- summary: node.contextPacket.compaction.wasCompacted
320
- ? `Context compacted by ${node.contextPacket.compaction.omittedChars} characters`
321
- : 'Context packet prepared without compaction',
322
- metadata: {
323
- protocol: node.contextPacket.protocol,
324
- compaction: node.contextPacket.compaction,
325
- upstreamArtifactCount: node.contextPacket.upstreamArtifacts.length,
326
- sourceNodeIds: node.contextPacket.upstreamArtifacts.flatMap((artifact) => artifact.sourceNodeIds),
327
- },
328
- });
329
- }
330
-
331
- if (node.adapterId || node.model) {
332
- pushEvent(events, {
333
- id: traceId([run.id, node.nodeId, 'provider']),
334
- type: 'provider',
335
- severity: node.status === 'failed' ? 'error' : 'info',
336
- status: node.a2aTaskId ? 'submitted' : node.status,
337
- timestamp: timestamp + 2,
338
- durationMs: nodeDuration,
339
- ...base,
340
- title: 'Provider call',
341
- titleKey: 'workflow.trace.providerCall',
342
- summary: [node.adapterId, node.model].filter(Boolean).join(' / '),
343
- metadata: {
344
- a2aTaskId: node.a2aTaskId,
345
- permissionMode: node.permissionMode,
346
- timeoutMs: node.timeoutMs,
347
- },
348
- });
349
- }
350
-
351
- (node.messages ?? [])
352
- .filter((message) => message.role !== 'user' && message.text.trim())
353
- .forEach((message, messageIndex) => {
354
- pushEvent(events, {
355
- id: traceId([run.id, node.nodeId, 'message', messageIndex]),
356
- type: 'message',
357
- severity: 'info',
358
- status: node.status,
359
- timestamp: message.createdAt ?? timestamp + 10 + messageIndex,
360
- ...base,
361
- title: 'Agent message',
362
- titleKey: 'workflow.trace.agentMessage',
363
- summary: redactTraceText(message.text, run),
364
- metadata: {
365
- role: message.role,
366
- },
367
- });
368
- });
369
-
370
- (node.artifacts ?? []).forEach((artifact, artifactIndex) => {
371
- pushEvent(events, {
372
- id: traceId([run.id, node.nodeId, 'artifact', artifactIndex]),
373
- type: artifactType(artifact.type),
374
- severity: 'info',
375
- status: node.status,
376
- timestamp: node.finishedAt ?? timestamp + 20 + artifactIndex,
377
- ...base,
378
- title: artifactTitle(artifact.type),
379
- titleKey: artifactTitleKey(artifact.type),
380
- summary: artifactSummary(artifact, run),
381
- metadata: {
382
- artifactType: artifact.type,
383
- artifactMetadata: artifact.metadata,
384
- },
385
- });
386
- });
387
-
388
- if (node.error) {
389
- pushEvent(events, {
390
- id: traceId([run.id, node.nodeId, 'error']),
391
- type: 'error',
392
- severity: 'error',
393
- status: node.status,
394
- timestamp: node.finishedAt ?? timestamp + 30,
395
- durationMs: nodeDuration,
396
- ...base,
397
- title: 'Step error',
398
- titleKey: 'workflow.trace.error',
399
- summary: redactTraceText(node.error, run),
400
- });
401
- }
402
- });
403
-
404
- if (run.finishedAt) {
405
- pushEvent(events, {
406
- id: traceId([run.id, 'run-finished']),
407
- type: 'run',
408
- severity: run.status === 'failed' ? 'error' : 'info',
409
- status: run.status,
410
- timestamp: run.finishedAt,
411
- durationMs: durationMs(run.startedAt, run.finishedAt),
412
- actor: 'Pixcode',
413
- title: 'Workflow run finished',
414
- titleKey: 'workflow.trace.runFinished',
415
- summary: redactTraceText(readString(run.metadata?.error), run),
416
- metadata: {
417
- workflowId: run.workflowId,
418
- contextId: run.contextId,
419
- },
420
- });
421
- }
422
-
423
- return events.sort((a, b) => a.timestamp - b.timestamp || a.id.localeCompare(b.id));
424
- }