@undefineds.co/linx 0.3.18 → 0.3.20

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 (40) hide show
  1. package/dist/lib/auto-mode/pod-persistence.js +0 -2
  2. package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
  3. package/dist/lib/capture/persistence.js +377 -0
  4. package/dist/lib/capture/persistence.js.map +1 -0
  5. package/dist/lib/capture/tool.js +242 -0
  6. package/dist/lib/capture/tool.js.map +1 -0
  7. package/dist/lib/linx-cloud-errors.js +5 -0
  8. package/dist/lib/linx-cloud-errors.js.map +1 -1
  9. package/dist/lib/linx-status-line.js +8 -1
  10. package/dist/lib/linx-status-line.js.map +1 -1
  11. package/dist/lib/models.js.map +1 -1
  12. package/dist/lib/pi-adapter/branding.js +103 -34
  13. package/dist/lib/pi-adapter/branding.js.map +1 -1
  14. package/dist/lib/pi-adapter/interactive.js +42 -29
  15. package/dist/lib/pi-adapter/interactive.js.map +1 -1
  16. package/dist/lib/pi-adapter/pod-mirror.js +102 -4
  17. package/dist/lib/pi-adapter/pod-mirror.js.map +1 -1
  18. package/dist/lib/pi-adapter/pod-native.js +0 -2
  19. package/dist/lib/pi-adapter/pod-native.js.map +1 -1
  20. package/dist/lib/pi-adapter/runtime.js +12 -2
  21. package/dist/lib/pi-adapter/runtime.js.map +1 -1
  22. package/dist/lib/status-line-command.js +2 -2
  23. package/dist/lib/status-line-command.js.map +1 -1
  24. package/dist/lib/symphony/pod-projection.js +104 -58
  25. package/dist/lib/symphony/pod-projection.js.map +1 -1
  26. package/dist/lib/symphony-command.js +1 -1
  27. package/dist/lib/symphony-command.js.map +1 -1
  28. package/dist/skills/basic/SKILL.md +46 -0
  29. package/dist/skills/capture/SKILL.md +165 -0
  30. package/dist/skills/symphony/SKILL.md +14 -4
  31. package/dist/skills/xpod-cli/SKILL.md +13 -2
  32. package/package.json +2 -2
  33. package/vendor/agent-runtime/dist/coordination.d.ts +93 -0
  34. package/vendor/agent-runtime/dist/coordination.js +145 -0
  35. package/vendor/agent-runtime/dist/index.d.ts +1 -0
  36. package/vendor/agent-runtime/dist/index.js +1 -0
  37. package/vendor/agent-runtime/dist/reconciler.d.ts +11 -0
  38. package/vendor/agent-runtime/dist/reconciler.js +41 -3
  39. package/vendor/agent-runtime/dist/symphony.d.ts +11 -9
  40. package/vendor/agent-runtime/dist/symphony.js +11 -7
@@ -11,7 +11,7 @@ export const configCommand = {
11
11
  };
12
12
  const statusLineCommand = {
13
13
  command: 'status-line [args..]',
14
- aliases: ['statusline', 'footer'],
14
+ aliases: ['statusline'],
15
15
  describe: 'Show or configure the LinX TUI status line',
16
16
  builder: (yargs) => yargs
17
17
  .positional('args', {
@@ -24,7 +24,7 @@ const statusLineCommand = {
24
24
  describe: 'Enable or disable status line colors when setting tokens',
25
25
  })
26
26
  .example('$0 config status-line', 'Show the effective status line config')
27
- .example('$0 config status-line set model-with-reasoning git-branch context-remaining', 'Configure status line tokens')
27
+ .example('$0 config status-line set mode model-with-reasoning git-branch context-remaining', 'Configure status line tokens')
28
28
  .example('$0 config status-line colors off', 'Disable dimmed status line colors')
29
29
  .example('$0 config status-line reset', 'Return to the built-in default'),
30
30
  handler: runStatusLineCommand,
@@ -1 +1 @@
1
- {"version":3,"file":"status-line-command.js","sourceRoot":"","sources":["../../src/lib/status-line-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status-line-command.js","sourceRoot":"","sources":["../../src/lib/status-line-command.ts"],"names":[],"mappings":"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"}
@@ -358,7 +358,7 @@ async function createDefaultRuntime() {
358
358
  runResource: models.runResource,
359
359
  runStepResource: models.runStepResource,
360
360
  agentResource: models.agentResource,
361
- contactResource: models.contactTable,
361
+ contactResource: models.contactResource,
362
362
  auditResource: models.auditResource,
363
363
  inboxNotificationResource: models.inboxNotificationResource,
364
364
  writePodFile: writePodFileToSession,
@@ -592,11 +592,11 @@ function resolveSymphonyRuntimeSessionRelation(plan, webId, worker) {
592
592
  return 'runtime-projected-worker-session';
593
593
  }
594
594
  function buildSymphonyWorkspaceMetadata(plan, worker) {
595
- const workspace = normalizeSymphonyWorkspaceRef(worker.session.workspace ?? plan.session.workspace, worker.session.cwd ?? plan.session.cwd);
595
+ const workspace = normalizeWorkerWorkspaceRef(worker.session.workspaceRef ?? plan.session.workspaceRef, worker.session.cwd ?? plan.session.cwd);
596
596
  return {
597
597
  path: workspace.path,
598
598
  kind: workspace.kind,
599
- ...(workspace.workspaceUri ? { uri: workspace.workspaceUri } : {}),
599
+ ...(workspace.workspace ? { uri: workspace.workspace } : {}),
600
600
  ...(workspace.repository ? { repository: workspace.repository } : {}),
601
601
  ...(workspace.branch ? { branch: workspace.branch } : {}),
602
602
  ...(workspace.worktree ? { worktree: workspace.worktree } : {}),
@@ -609,14 +609,14 @@ function buildSymphonyWorkspaceMetadata(plan, worker) {
609
609
  equivalenceRequires: ['baseRevision', 'checksum-or-etag-or-artifact-uri'],
610
610
  };
611
611
  }
612
- function normalizeSymphonyWorkspaceRef(workspace, fallbackPath) {
612
+ function normalizeWorkerWorkspaceRef(workspace, fallbackPath) {
613
613
  return {
614
614
  path: workspace?.path ?? fallbackPath,
615
615
  kind: workspace?.kind ?? 'folder',
616
616
  ...(workspace?.repository ? { repository: workspace.repository } : {}),
617
617
  ...(workspace?.branch ? { branch: workspace.branch } : {}),
618
618
  ...(workspace?.worktree ? { worktree: workspace.worktree } : {}),
619
- ...(workspace?.workspaceUri ? { workspaceUri: workspace.workspaceUri } : {}),
619
+ ...(workspace?.workspace ? { workspace: workspace.workspace } : {}),
620
620
  ...(workspace?.baseRevision ? { baseRevision: workspace.baseRevision } : {}),
621
621
  ...(workspace?.environment ? { environment: workspace.environment } : {}),
622
622
  };
@@ -836,10 +836,13 @@ function buildSymphonyChatRow(plan, webId, stage, lastPreview) {
836
836
  const createdAt = safeDate(plan.issue.createdAt);
837
837
  const updatedAt = safeDate(plan.session.updatedAt);
838
838
  const secretaryAgent = agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID });
839
- const workerAgents = plan.workers.map((worker) => agentResource.buildIri(webId, {
840
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
839
+ const secretaryContact = buildSecretaryContactIri(webId);
840
+ const workerMembers = plan.workers.map((worker) => ({
841
+ contact: buildWorkerContactIri(webId, worker),
842
+ agent: buildWorkerAgentIri(webId, worker),
843
+ label: worker.session.target.label ?? worker.session.target.contact ?? worker.session.target.agent ?? backendDisplayName(worker.session.backend),
841
844
  }));
842
- const participants = Array.from(new Set([webId, secretaryAgent, ...workerAgents]));
845
+ const participants = Array.from(new Set([webId, secretaryContact, ...workerMembers.map((member) => member.contact)]));
843
846
  const targetChat = selectTargetChatIri(plan.session.target?.chat, webId, plan);
844
847
  return {
845
848
  id: buildTargetChatId(plan, webId),
@@ -849,23 +852,23 @@ function buildSymphonyChatRow(plan, webId, stage, lastPreview) {
849
852
  kind: targetChat === buildSymphonyChatUri(webId) ? 'symphony-control-room' : 'symphony-target-room',
850
853
  surface: 'symphony',
851
854
  secretaryAgent,
855
+ secretaryContact,
852
856
  currentBackend: plan.session.backend,
853
857
  target: plan.session.target,
854
858
  currentStage: stage,
855
859
  memberRoles: Object.fromEntries([
856
860
  [webId, 'owner'],
857
- [secretaryAgent, 'admin'],
858
- ...workerAgents.map((agent) => [agent, 'member']),
861
+ [secretaryContact, 'admin'],
862
+ ...workerMembers.map((member) => [member.contact, 'member']),
859
863
  ]),
860
864
  members: [
861
865
  { uri: webId, role: 'user', label: 'User' },
862
- { uri: secretaryAgent, role: 'secretary', label: 'AI Secretary' },
863
- ...plan.workers.map((worker) => ({
864
- uri: agentResource.buildIri(webId, {
865
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
866
- }),
866
+ { uri: secretaryContact, agent: secretaryAgent, role: 'secretary', label: 'AI Secretary' },
867
+ ...workerMembers.map((member) => ({
868
+ uri: member.contact,
869
+ agent: member.agent,
867
870
  role: 'worker',
868
- label: worker.session.target.label ?? worker.session.target.agent ?? backendDisplayName(worker.session.backend),
871
+ label: member.label,
869
872
  })),
870
873
  ],
871
874
  },
@@ -902,6 +905,9 @@ function buildSymphonyWorkerSummary(plan, webId, worker) {
902
905
  sessionResource: buildSymphonyWorkerSessionUri(webId, worker),
903
906
  backend: worker.session.backend,
904
907
  agent: worker.session.target.agent,
908
+ contact: worker.session.target.contact ?? buildWorkerContactId(worker),
909
+ contactResource: buildWorkerContactIri(webId, worker),
910
+ agentResource: buildWorkerAgentIri(webId, worker),
905
911
  status: worker.session.status,
906
912
  autoModeSessionId: worker.session.autoModeSessionId,
907
913
  target: worker.session.target,
@@ -1020,7 +1026,6 @@ function buildSymphonySessionRow(plan, webId, worker = plan.workers[0] ?? {
1020
1026
  owner: webId,
1021
1027
  chat: selectWorkerChatIri(plan, webId, worker),
1022
1028
  thread: selectWorkerThreadIri(plan, webId, worker),
1023
- sessionType: 'group',
1024
1029
  status,
1025
1030
  tool: `symphony:${worker.session.backend}`,
1026
1031
  tokenUsage: 0,
@@ -1056,6 +1061,7 @@ function buildSymphonySessionRow(plan, webId, worker = plan.workers[0] ?? {
1056
1061
  function buildSymphonyIssueRow(plan, webId) {
1057
1062
  const createdAt = safeDate(plan.issue.createdAt);
1058
1063
  const updatedAt = safeDate(plan.issue.updatedAt);
1064
+ const secretaryContact = buildSecretaryContactIri(webId);
1059
1065
  return {
1060
1066
  id: buildSymphonyIssueId(plan.issue),
1061
1067
  // File-primary: title remains a compact index label for existing Issue schemas.
@@ -1071,7 +1077,7 @@ function buildSymphonyIssueRow(plan, webId) {
1071
1077
  tasks: Array.from(new Set((plan.issue.tasks?.length ? plan.issue.tasks : plan.workers.map((worker) => worker.task))
1072
1078
  .map((task) => normalizeSymphonyTaskIri(webId, task)))),
1073
1079
  createdBy: plan.issue.issuer.webId ?? webId,
1074
- assignedTo: agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID }),
1080
+ assignedTo: secretaryContact,
1075
1081
  createdAt,
1076
1082
  updatedAt,
1077
1083
  ...(plan.issue.closedAt ? { closedAt: safeDate(plan.issue.closedAt) } : {}),
@@ -1130,9 +1136,8 @@ function mapSymphonyRunStatus(status) {
1130
1136
  function buildSymphonyTaskRow(plan, webId, worker) {
1131
1137
  const createdAt = safeDate(worker.taskRecord.createdAt);
1132
1138
  const updatedAt = safeDate(worker.taskRecord.updatedAt);
1133
- const workerAgent = agentResource.buildIri(webId, {
1134
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
1135
- });
1139
+ const workerContact = buildWorkerContactIri(webId, worker);
1140
+ const workerAgent = buildWorkerAgentIri(webId, worker);
1136
1141
  return {
1137
1142
  id: taskResource.buildId({ id: buildSymphonyTaskKey(worker.task) }),
1138
1143
  title: worker.taskRecord.title,
@@ -1144,7 +1149,7 @@ function buildSymphonyTaskRow(plan, webId, worker) {
1144
1149
  workspace: pathToWorkspaceUri(worker.session.cwd) ?? pathToWorkspaceUri(plan.session.cwd) ?? 'file:///',
1145
1150
  status: mapSymphonyTaskStatus(worker.taskRecord.status),
1146
1151
  priority: plan.issue.priority,
1147
- assignedTo: workerAgent,
1152
+ assignedTo: workerContact,
1148
1153
  source: buildSymphonyIssueIri(webId, plan.issue),
1149
1154
  metadata: {
1150
1155
  surface: 'symphony',
@@ -1152,6 +1157,8 @@ function buildSymphonyTaskRow(plan, webId, worker) {
1152
1157
  acceptanceCriteria: worker.taskRecord.acceptanceCriteria,
1153
1158
  backend: worker.session.backend,
1154
1159
  target: worker.session.target,
1160
+ assignedContact: workerContact,
1161
+ assignedAgent: workerAgent,
1155
1162
  workspace: buildSymphonyWorkspaceMetadata(plan, worker),
1156
1163
  spaceContract: buildSymphonySpaceContract(plan, webId, worker),
1157
1164
  podAccessPolicy: buildSymphonyWorkerPodAccessPolicy(plan, webId, worker),
@@ -1165,9 +1172,9 @@ function buildSymphonyDeliveryRow(plan, webId, worker) {
1165
1172
  const createdAt = safeDate(worker.delivery.createdAt);
1166
1173
  const updatedAt = safeDate(worker.delivery.updatedAt);
1167
1174
  const secretaryAgent = agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID });
1168
- const workerAgent = agentResource.buildIri(webId, {
1169
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
1170
- });
1175
+ const secretaryContact = buildSecretaryContactIri(webId);
1176
+ const workerAgent = buildWorkerAgentIri(webId, worker);
1177
+ const workerContact = buildWorkerContactIri(webId, worker);
1171
1178
  return {
1172
1179
  id: deliveryResource.buildId({
1173
1180
  id: getSymphonyArchiveKey(worker.delivery.uri),
@@ -1177,8 +1184,8 @@ function buildSymphonyDeliveryRow(plan, webId, worker) {
1177
1184
  kind: worker.delivery.type,
1178
1185
  status: worker.delivery.status,
1179
1186
  task: buildSymphonyTaskIri(webId, worker.task),
1180
- source: secretaryAgent,
1181
- target: workerAgent,
1187
+ source: secretaryContact,
1188
+ target: workerContact,
1182
1189
  chat: selectWorkerChatIri(plan, webId, worker),
1183
1190
  thread: selectWorkerThreadIri(plan, webId, worker),
1184
1191
  targetThread: selectWorkerThreadIri(plan, webId, worker),
@@ -1192,6 +1199,8 @@ function buildSymphonyDeliveryRow(plan, webId, worker) {
1192
1199
  backend: worker.session.backend,
1193
1200
  mode: worker.session.mode,
1194
1201
  target: worker.session.target,
1202
+ targetContact: workerContact,
1203
+ targetAgent: workerAgent,
1195
1204
  workspace: buildSymphonyWorkspaceMetadata(plan, worker),
1196
1205
  spaceContract: buildSymphonySpaceContract(plan, webId, worker),
1197
1206
  podAccessPolicy: buildSymphonyWorkerPodAccessPolicy(plan, webId, worker),
@@ -1208,6 +1217,9 @@ function buildSymphonyDeliveryRow(plan, webId, worker) {
1208
1217
  session: worker.session.uri,
1209
1218
  }),
1210
1219
  autoModeSessionId: worker.delivery.autoModeSessionId,
1220
+ sourceAgent: secretaryAgent,
1221
+ targetContact: workerContact,
1222
+ targetAgent: workerAgent,
1211
1223
  workspace: buildSymphonyWorkspaceMetadata(plan, worker),
1212
1224
  spaceContract: buildSymphonySpaceContract(plan, webId, worker),
1213
1225
  podAccessPolicy: buildSymphonyWorkerPodAccessPolicy(plan, webId, worker),
@@ -1224,9 +1236,7 @@ function buildSymphonyDeliveryRow(plan, webId, worker) {
1224
1236
  }
1225
1237
  function buildSymphonyReportRow(plan, webId, worker, stage) {
1226
1238
  const completedAt = safeDate(worker.session.completedAt ?? worker.session.updatedAt);
1227
- const workerAgent = agentResource.buildIri(webId, {
1228
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
1229
- });
1239
+ const workerAgent = buildWorkerAgentIri(webId, worker);
1230
1240
  const run = buildSymphonyRunIri(webId, worker);
1231
1241
  const task = buildSymphonyTaskIri(webId, worker.task);
1232
1242
  const status = worker.session.status === 'failed' || stage === 'failed' ? 'failed' : 'completed';
@@ -1286,9 +1296,7 @@ function buildSymphonyEvidenceRow(plan, webId, worker, stage) {
1286
1296
  const task = buildSymphonyTaskIri(webId, worker.task);
1287
1297
  const delivery = buildSymphonyDeliveryIri(webId, worker);
1288
1298
  const runStep = buildSymphonyRunStepIri(webId, worker, stage);
1289
- const workerAgent = agentResource.buildIri(webId, {
1290
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
1291
- });
1299
+ const workerAgent = buildWorkerAgentIri(webId, worker);
1292
1300
  return {
1293
1301
  id: evidenceResource.buildId({
1294
1302
  id: `${getSymphonyArchiveKey(worker.session.uri)}-${stage}`,
@@ -1336,7 +1344,7 @@ function buildPostRunReconciliationMetadata(plan, webId, worker, stage) {
1336
1344
  return {
1337
1345
  required: true,
1338
1346
  status: 'pending_secretary_review',
1339
- owner: agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID }),
1347
+ owner: buildSecretaryContactIri(webId),
1340
1348
  sourceIssue: buildSymphonyIssueIri(webId, plan.issue),
1341
1349
  sourceTask: buildSymphonyTaskIri(webId, worker.task),
1342
1350
  sourceDelivery: buildSymphonyDeliveryIri(webId, worker),
@@ -1356,10 +1364,10 @@ function buildPostRunReconciliationMetadata(plan, webId, worker, stage) {
1356
1364
  }
1357
1365
  function buildSymphonyReportDeliveryRow(plan, webId, worker, stage) {
1358
1366
  const completedAt = safeDate(worker.session.completedAt ?? worker.session.updatedAt);
1359
- const workerAgent = agentResource.buildIri(webId, {
1360
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
1361
- });
1367
+ const workerAgent = buildWorkerAgentIri(webId, worker);
1368
+ const workerContact = buildWorkerContactIri(webId, worker);
1362
1369
  const secretaryAgent = agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID });
1370
+ const secretaryContact = buildSecretaryContactIri(webId);
1363
1371
  const run = buildSymphonyRunIri(webId, worker);
1364
1372
  const report = buildSymphonyReportIri(webId, worker);
1365
1373
  const task = buildSymphonyTaskIri(webId, worker.task);
@@ -1379,8 +1387,8 @@ function buildSymphonyReportDeliveryRow(plan, webId, worker, stage) {
1379
1387
  kind: 'report',
1380
1388
  status: 'completed',
1381
1389
  task,
1382
- source: workerAgent,
1383
- target: secretaryAgent,
1390
+ source: workerContact,
1391
+ target: secretaryContact,
1384
1392
  chat: selectWorkerChatIri(plan, webId, worker),
1385
1393
  thread: selectWorkerThreadIri(plan, webId, worker),
1386
1394
  targetThread: selectTargetThreadIri(plan.issue.thread ?? worker.session.target?.thread, webId, plan),
@@ -1401,6 +1409,9 @@ function buildSymphonyReportDeliveryRow(plan, webId, worker, stage) {
1401
1409
  run,
1402
1410
  backend: worker.session.backend,
1403
1411
  agent: worker.session.target.agent,
1412
+ contact: worker.session.target.contact ?? buildWorkerContactId(worker),
1413
+ sourceAgent: workerAgent,
1414
+ sourceContact: workerContact,
1404
1415
  autoModeSessionId: worker.session.autoModeSessionId,
1405
1416
  exitCode: worker.session.exitCode,
1406
1417
  error: worker.session.error ?? worker.delivery.error ?? worker.taskRecord.error,
@@ -1512,13 +1523,30 @@ function buildSymphonyRunStepRow(plan, webId, worker, stage) {
1512
1523
  createdAt,
1513
1524
  };
1514
1525
  }
1515
- function buildWorkerAgentId(backend, agent) {
1516
- const suffix = (agent ?? `${backend}-worker`)
1526
+ function normalizeSymphonyActorKey(value, fallback) {
1527
+ return (value ?? fallback)
1517
1528
  .trim()
1518
1529
  .replace(/[^a-zA-Z0-9._-]/gu, '-')
1519
1530
  .replace(/-+/gu, '-')
1520
- .replace(/^-|-$/gu, '');
1521
- return `symphony-${suffix || `${backend}-worker`}`;
1531
+ .replace(/^-|-$/gu, '')
1532
+ || fallback;
1533
+ }
1534
+ function buildWorkerContactId(worker) {
1535
+ return normalizeSymphonyActorKey(worker.session.target.contact ?? worker.session.target.agent ?? worker.delivery.targetAgent, worker.session.backend);
1536
+ }
1537
+ function buildWorkerAgentId(backend, agent, contact) {
1538
+ return normalizeSymphonyActorKey(agent ?? contact, backend);
1539
+ }
1540
+ function buildSecretaryContactIri(webId) {
1541
+ return contactResource.buildIri(webId, { id: SYMPHONY_CONTACT_ID });
1542
+ }
1543
+ function buildWorkerAgentIri(webId, worker) {
1544
+ return agentResource.buildIri(webId, {
1545
+ id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent, worker.session.target.contact),
1546
+ });
1547
+ }
1548
+ function buildWorkerContactIri(webId, worker) {
1549
+ return contactResource.buildIri(webId, { id: buildWorkerContactId(worker) });
1522
1550
  }
1523
1551
  function buildSymphonyAgents(plan) {
1524
1552
  const now = safeDate(plan.session.updatedAt);
@@ -1535,7 +1563,7 @@ function buildSymphonyAgents(plan) {
1535
1563
  ];
1536
1564
  const seen = new Set(agents.map((agent) => agent.id));
1537
1565
  for (const worker of plan.workers) {
1538
- const id = buildWorkerAgentId(worker.session.backend, worker.session.target.agent);
1566
+ const id = buildWorkerAgentId(worker.session.backend, worker.session.target.agent, worker.session.target.contact);
1539
1567
  if (seen.has(id)) {
1540
1568
  continue;
1541
1569
  }
@@ -1554,15 +1582,35 @@ function buildSymphonyAgents(plan) {
1554
1582
  }
1555
1583
  function buildSymphonyContacts(plan, webId) {
1556
1584
  const now = safeDate(plan.session.updatedAt);
1557
- return buildSymphonyAgents(plan).map((agent) => ({
1558
- id: agent.id === SYMPHONY_SECRETARY_AGENT_ID ? SYMPHONY_CONTACT_ID : `${agent.id}-contact`,
1559
- name: agent.name,
1560
- entity: agentResource.buildIri(webId, { id: agent.id }),
1561
- rdfType: ContactClass.AGENT,
1562
- contactType: ContactType.AGENT,
1563
- createdAt: now,
1564
- updatedAt: now,
1565
- }));
1585
+ const contacts = [
1586
+ {
1587
+ id: SYMPHONY_CONTACT_ID,
1588
+ name: 'AI Secretary',
1589
+ entity: agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID }),
1590
+ rdfType: ContactClass.AGENT,
1591
+ contactType: ContactType.AGENT,
1592
+ createdAt: now,
1593
+ updatedAt: now,
1594
+ },
1595
+ ];
1596
+ const seen = new Set(contacts.map((contact) => contact.id));
1597
+ for (const worker of plan.workers) {
1598
+ const id = buildWorkerContactId(worker);
1599
+ if (seen.has(id)) {
1600
+ continue;
1601
+ }
1602
+ seen.add(id);
1603
+ contacts.push({
1604
+ id,
1605
+ name: worker.session.target.label ?? worker.session.target.contact ?? worker.session.target.agent ?? backendDisplayName(worker.session.backend),
1606
+ entity: buildWorkerAgentIri(webId, worker),
1607
+ rdfType: ContactClass.AGENT,
1608
+ contactType: ContactType.AGENT,
1609
+ createdAt: now,
1610
+ updatedAt: now,
1611
+ });
1612
+ }
1613
+ return contacts;
1566
1614
  }
1567
1615
  function buildProgressBlock(plan, stage) {
1568
1616
  const statusByStage = {
@@ -1628,7 +1676,7 @@ function buildStatusMessageRow(plan, webId, stage) {
1628
1676
  const content = buildStatusContent(plan, stage);
1629
1677
  const secretaryAgent = agentResource.buildIri(webId, { id: SYMPHONY_SECRETARY_AGENT_ID });
1630
1678
  const routeTargetAgent = agentResource.buildIri(webId, {
1631
- id: buildWorkerAgentId(plan.session.backend, plan.session.target?.agent),
1679
+ id: buildWorkerAgentId(plan.session.backend, plan.session.target?.agent, plan.session.target?.contact),
1632
1680
  });
1633
1681
  return {
1634
1682
  id: `${buildSymphonyThreadId(plan)}-${stage}`,
@@ -1656,6 +1704,7 @@ function buildStatusMessageRow(plan, webId, stage) {
1656
1704
  session: worker.session.uri,
1657
1705
  backend: worker.session.backend,
1658
1706
  agent: worker.session.target.agent,
1707
+ contact: worker.session.target.contact ?? buildWorkerContactId(worker),
1659
1708
  status: worker.session.status,
1660
1709
  autoModeSessionId: worker.session.autoModeSessionId,
1661
1710
  })),
@@ -1693,9 +1742,7 @@ function buildSymphonyReportInboxNotificationRow(webId, worker) {
1693
1742
  const createdAt = safeDate(worker.session.completedAt ?? worker.session.updatedAt);
1694
1743
  return {
1695
1744
  id: stableReportInboxNotificationId(worker),
1696
- actor: agentResource.buildIri(webId, {
1697
- id: buildWorkerAgentId(worker.session.backend, worker.session.target.agent),
1698
- }),
1745
+ actor: buildWorkerContactIri(webId, worker),
1699
1746
  object: buildSymphonyReportDeliveryIri(webId, worker),
1700
1747
  createdAt,
1701
1748
  };
@@ -1758,7 +1805,6 @@ async function upsertSession(db, runtime, row) {
1758
1805
  owner: row.owner,
1759
1806
  chat: row.chat,
1760
1807
  thread: row.thread,
1761
- sessionType: row.sessionType,
1762
1808
  status: row.status,
1763
1809
  tool: row.tool,
1764
1810
  tokenUsage: row.tokenUsage,