@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.
- package/dist/lib/auto-mode/pod-persistence.js +0 -2
- package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
- package/dist/lib/capture/persistence.js +377 -0
- package/dist/lib/capture/persistence.js.map +1 -0
- package/dist/lib/capture/tool.js +242 -0
- package/dist/lib/capture/tool.js.map +1 -0
- package/dist/lib/linx-cloud-errors.js +5 -0
- package/dist/lib/linx-cloud-errors.js.map +1 -1
- package/dist/lib/linx-status-line.js +8 -1
- package/dist/lib/linx-status-line.js.map +1 -1
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/pi-adapter/branding.js +103 -34
- package/dist/lib/pi-adapter/branding.js.map +1 -1
- package/dist/lib/pi-adapter/interactive.js +42 -29
- package/dist/lib/pi-adapter/interactive.js.map +1 -1
- package/dist/lib/pi-adapter/pod-mirror.js +102 -4
- package/dist/lib/pi-adapter/pod-mirror.js.map +1 -1
- package/dist/lib/pi-adapter/pod-native.js +0 -2
- package/dist/lib/pi-adapter/pod-native.js.map +1 -1
- package/dist/lib/pi-adapter/runtime.js +12 -2
- package/dist/lib/pi-adapter/runtime.js.map +1 -1
- package/dist/lib/status-line-command.js +2 -2
- package/dist/lib/status-line-command.js.map +1 -1
- package/dist/lib/symphony/pod-projection.js +104 -58
- package/dist/lib/symphony/pod-projection.js.map +1 -1
- package/dist/lib/symphony-command.js +1 -1
- package/dist/lib/symphony-command.js.map +1 -1
- package/dist/skills/basic/SKILL.md +46 -0
- package/dist/skills/capture/SKILL.md +165 -0
- package/dist/skills/symphony/SKILL.md +14 -4
- package/dist/skills/xpod-cli/SKILL.md +13 -2
- package/package.json +2 -2
- package/vendor/agent-runtime/dist/coordination.d.ts +93 -0
- package/vendor/agent-runtime/dist/coordination.js +145 -0
- package/vendor/agent-runtime/dist/index.d.ts +1 -0
- package/vendor/agent-runtime/dist/index.js +1 -0
- package/vendor/agent-runtime/dist/reconciler.d.ts +11 -0
- package/vendor/agent-runtime/dist/reconciler.js +41 -3
- package/vendor/agent-runtime/dist/symphony.d.ts +11 -9
- 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'
|
|
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":"AACA,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,GAE/B,MAAM,uBAAuB,CAAA;AAO9B,MAAM,CAAC,MAAM,aAAa,GAAkC;IAC1D,OAAO,EAAE,kBAAkB;IAC3B,QAAQ,EAAE,uCAAuC;IACjD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,iBAAiB,CAAC;SAC1B,aAAa,CAAC,CAAC,EAAE,iEAAiE,CAAC;SACnF,MAAM,EAAE;SACR,IAAI,EAAE;IACX,OAAO,KAAU,CAAC;CACnB,CAAA;AAED,MAAM,iBAAiB,GAA0C;IAC/D,OAAO,EAAE,sBAAsB;IAC/B,OAAO,EAAE,CAAC,YAAY,
|
|
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.
|
|
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 =
|
|
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.
|
|
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
|
|
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?.
|
|
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
|
|
840
|
-
|
|
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,
|
|
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
|
-
[
|
|
858
|
-
...
|
|
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
|
-
...
|
|
864
|
-
uri:
|
|
865
|
-
|
|
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:
|
|
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:
|
|
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
|
|
1134
|
-
|
|
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:
|
|
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
|
|
1169
|
-
|
|
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:
|
|
1181
|
-
target:
|
|
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 =
|
|
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 =
|
|
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:
|
|
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 =
|
|
1360
|
-
|
|
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:
|
|
1383
|
-
target:
|
|
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
|
|
1516
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
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:
|
|
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,
|