@sjawhar/pi-legion-envoy 0.16.0 → 0.16.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 (3) hide show
  1. package/dist/envoy.js +60 -146
  2. package/dist/legion.js +60 -146
  3. package/package.json +1 -1
package/dist/envoy.js CHANGED
@@ -30785,147 +30785,37 @@ var ChildStatusPayloadSchema = object({
30785
30785
  from: string2().optional(),
30786
30786
  to: string2().optional()
30787
30787
  });
30788
- function dispatchActorLabel(actor) {
30789
- return `${actor.kind} ${actor.id ?? "unknown"}`;
30790
- }
30791
- function dispatchBody(event) {
30792
- const lines = [];
30793
- switch (event.type) {
30794
- case "issue.created":
30795
- case "issue.updated":
30796
- case "issue.closed": {
30797
- const parsed = IssuePayloadSchema.safeParse(event.payload);
30798
- if (!parsed.success)
30799
- break;
30800
- if (parsed.data.title)
30801
- lines.push(`Title: ${parsed.data.title}`);
30802
- if (parsed.data.status)
30803
- lines.push(`Status: ${parsed.data.status}`);
30804
- if (parsed.data.route)
30805
- lines.push(`Route: ${parsed.data.route}`);
30806
- break;
30807
- }
30808
- case "artifact.created": {
30809
- const parsed = ArtifactCreatedPayloadSchema.safeParse(event.payload);
30810
- const name = parsed.success ? parsed.data.artifact?.name : undefined;
30811
- if (name)
30812
- lines.push(`Artifact: ${name}`);
30813
- break;
30814
- }
30815
- case "artifact.version": {
30816
- const parsed = ArtifactVersionPayloadSchema.safeParse(event.payload);
30817
- if (!parsed.success)
30818
- break;
30819
- const version = parsed.data.version;
30820
- if (parsed.data.name)
30821
- lines.push(`Artifact: ${parsed.data.name}`);
30822
- if (version?.number !== undefined)
30823
- lines.push(`Version: ${version.number}`);
30824
- if (version?.summary)
30825
- lines.push(`Summary: ${version.summary}`);
30826
- if (parsed.data.diff)
30827
- lines.push("Diff:", parsed.data.diff);
30828
- break;
30829
- }
30830
- case "ask.opened":
30831
- case "ask.answered": {
30832
- const parsed = AskPayloadSchema.safeParse(event.payload);
30833
- if (!parsed.success)
30834
- break;
30835
- if (parsed.data.question)
30836
- lines.push(`Question: ${parsed.data.question}`);
30837
- if (event.type === "ask.opened") {
30838
- const options = (parsed.data.options ?? []).map((option) => option.label).filter((label) => label !== undefined);
30839
- if (options.length > 0)
30840
- lines.push(`Options: ${options.join(", ")}`);
30841
- break;
30842
- }
30843
- const answer = parsed.data.answer;
30844
- lines.push(`Selected: ${answer?.selected?.join(", ") || "none"}`);
30845
- if (answer?.text)
30846
- lines.push(`Text: ${answer.text}`);
30847
- break;
30848
- }
30849
- case "comment.created":
30850
- case "comment.resolved": {
30851
- const parsed = CommentPayloadSchema.safeParse(event.payload);
30852
- if (!parsed.success)
30853
- break;
30854
- const quote = parsed.data.anchor?.quote;
30855
- if (parsed.data.artifact_name)
30856
- lines.push(`Artifact: ${parsed.data.artifact_name}`);
30857
- if (quote)
30858
- lines.push(`> ${quote}`);
30859
- if (parsed.data.reply_to)
30860
- lines.push(`Reply chain: ${parsed.data.reply_to}`);
30861
- if (parsed.data.body)
30862
- lines.push(`Body: ${parsed.data.body}`);
30863
- break;
30864
- }
30865
- case "suggestion.accepted":
30866
- case "suggestion.rejected": {
30867
- const parsed = CommentPayloadSchema.safeParse(event.payload);
30868
- if (!parsed.success)
30869
- break;
30870
- const quote = parsed.data.anchor?.quote;
30871
- const replacement = parsed.data.suggestion?.replace_with;
30872
- if (parsed.data.artifact_name)
30873
- lines.push(`Artifact: ${parsed.data.artifact_name}`);
30874
- if (quote)
30875
- lines.push(`> ${quote}`);
30876
- if (quote && replacement)
30877
- lines.push(`${quote} \u2192 ${replacement}`);
30878
- break;
30879
- }
30880
- case "message.created": {
30881
- const parsed = MessagePayloadSchema.safeParse(event.payload);
30882
- const body = parsed.success ? parsed.data.body : undefined;
30883
- if (body)
30884
- lines.push(`Body: ${body}`);
30885
- break;
30886
- }
30887
- case "child.status": {
30888
- const parsed = ChildStatusPayloadSchema.safeParse(event.payload);
30889
- if (!parsed.success)
30890
- break;
30891
- const { child_key: child, from, to } = parsed.data;
30892
- if (child && from && to)
30893
- lines.push(`Child: ${child} ${from} \u2192 ${to}`);
30894
- break;
30895
- }
30896
- }
30897
- return lines;
30898
- }
30899
- function renderDispatch(envelope, sessionID) {
30900
- const invalid = () => ({
30901
- skip: false,
30902
- content: "dispatch: invalid event",
30903
- envelope
30904
- });
30905
- if (envelope.payload === undefined)
30906
- return invalid();
30907
- let rawEvent;
30788
+ var DISPATCH_PAYLOAD_SCHEMAS = {
30789
+ "issue.created": IssuePayloadSchema,
30790
+ "issue.updated": IssuePayloadSchema,
30791
+ "issue.closed": IssuePayloadSchema,
30792
+ "artifact.created": ArtifactCreatedPayloadSchema,
30793
+ "artifact.version": ArtifactVersionPayloadSchema,
30794
+ "ask.opened": AskPayloadSchema,
30795
+ "ask.answered": AskPayloadSchema,
30796
+ "comment.created": CommentPayloadSchema,
30797
+ "comment.resolved": CommentPayloadSchema,
30798
+ "suggestion.accepted": CommentPayloadSchema,
30799
+ "suggestion.rejected": CommentPayloadSchema,
30800
+ "message.created": MessagePayloadSchema,
30801
+ "child.status": ChildStatusPayloadSchema
30802
+ };
30803
+ function dispatchPayload(event) {
30804
+ const schema = DISPATCH_PAYLOAD_SCHEMAS[event.type];
30805
+ if (schema === undefined)
30806
+ return event.payload;
30807
+ const parsed = schema.safeParse(event.payload);
30808
+ return parsed.success ? parsed.data : event.payload;
30809
+ }
30810
+ function parseDispatchFrame(rawPayload) {
30811
+ let value;
30908
30812
  try {
30909
- rawEvent = JSON.parse(envelope.payload);
30813
+ value = JSON.parse(rawPayload);
30910
30814
  } catch {
30911
- return invalid();
30912
- }
30913
- const parsed = DispatchEventSchema.safeParse(rawEvent);
30914
- if (!parsed.success)
30915
- return invalid();
30916
- const event = parsed.data;
30917
- if (event.actor.kind === "session" && event.actor.id === sessionID) {
30918
- return { skip: true, content: "", envelope };
30815
+ return { raw: rawPayload };
30919
30816
  }
30920
- return {
30921
- skip: false,
30922
- content: [
30923
- `dispatch ${event.issue_key} \xB7 ${event.type} \xB7 by ${dispatchActorLabel(event.actor)}`,
30924
- ...dispatchBody(event)
30925
- ].join(`
30926
- `),
30927
- envelope
30928
- };
30817
+ const parsed = DispatchEventSchema.safeParse(value);
30818
+ return parsed.success ? { event: parsed.data } : { raw: value };
30929
30819
  }
30930
30820
  function inboundTimestamp(milliseconds) {
30931
30821
  if (milliseconds === undefined)
@@ -30961,13 +30851,31 @@ function renderInbound(raw, sessionID, subject) {
30961
30851
  const data = tolerant.data;
30962
30852
  envelope = { ...data, source: data.source ?? "unknown" };
30963
30853
  }
30854
+ let dispatchEvent;
30855
+ let dispatchIssue;
30856
+ const dispatchRendered = envelope.source === "dispatch" && envelope.payload !== undefined;
30964
30857
  if (envelope.source === "dispatch") {
30965
- const renderedDispatch = renderDispatch(envelope, sessionID);
30966
- if (renderedDispatch !== null)
30967
- return renderedDispatch;
30858
+ if (envelope.payload === undefined) {
30859
+ dispatchIssue = "payload";
30860
+ } else {
30861
+ const frame = parseDispatchFrame(envelope.payload);
30862
+ if ("event" in frame) {
30863
+ if (frame.event.actor.kind === "session" && frame.event.actor.id === sessionID) {
30864
+ return { skip: true, content: "", envelope };
30865
+ }
30866
+ dispatchEvent = {
30867
+ issue_key: frame.event.issue_key,
30868
+ type: frame.event.type,
30869
+ actor: frame.event.actor,
30870
+ payload: dispatchPayload(frame.event)
30871
+ };
30872
+ } else {
30873
+ dispatchEvent = frame.raw;
30874
+ }
30875
+ }
30968
30876
  }
30969
30877
  let parsedPayload;
30970
- if (envelope.payload !== undefined && (envelope.source === "github" || envelope.payload !== envelope.payload_summary)) {
30878
+ if (!dispatchRendered && envelope.payload !== undefined && (envelope.source === "github" || envelope.payload !== envelope.payload_summary)) {
30971
30879
  try {
30972
30880
  parsedPayload = JSON.parse(envelope.payload);
30973
30881
  } catch {
@@ -30975,7 +30883,7 @@ function renderInbound(raw, sessionID, subject) {
30975
30883
  }
30976
30884
  }
30977
30885
  const payloadSummary = envelope.payload_summary ?? "unknown";
30978
- const message = envelope.payload !== undefined && envelope.payload !== envelope.payload_summary ? parsedPayload : undefined;
30886
+ const message = !dispatchRendered && envelope.payload !== undefined && envelope.payload !== envelope.payload_summary ? parsedPayload : undefined;
30979
30887
  const summaryIsHead = typeof message === "string" && envelope.payload_summary !== undefined && message.startsWith(envelope.payload_summary.endsWith("\u2026") ? envelope.payload_summary.slice(0, -1) : envelope.payload_summary);
30980
30888
  const body = `${envelope.payload_summary ?? ""}
30981
30889
  ${envelope.payload ?? ""}`;
@@ -30989,7 +30897,11 @@ ${envelope.payload ?? ""}`;
30989
30897
  const role = envelope.sender?.roles?.[0];
30990
30898
  const reply = replyWith(envelope);
30991
30899
  const sourceIssue = parseIssues.includes("source") || KNOWN_SOURCES[envelope.source] !== undefined ? undefined : `source=${envelope.source}`;
30992
- const unrecognised = [...parseIssues, ...sourceIssue === undefined ? [] : [sourceIssue]].join(", ") || undefined;
30900
+ const unrecognised = [
30901
+ ...parseIssues,
30902
+ ...sourceIssue === undefined ? [] : [sourceIssue],
30903
+ ...dispatchIssue === undefined ? [] : [dispatchIssue]
30904
+ ].join(", ") || undefined;
30993
30905
  const rendered = {
30994
30906
  ...envelope.topic === agentSubject(sessionID) ? { to: `you (${sessionID.slice(0, 4)}\u2026)` } : {},
30995
30907
  from: senderLabel(envelope),
@@ -31004,8 +30916,10 @@ ${envelope.payload ?? ""}`;
31004
30916
  ...role === undefined ? {} : {
31005
30917
  reply_role: `envoy_publish(topic="notifications.role.${role}", message="...")`
31006
30918
  },
31007
- ...summaryIsHead ? {} : { summary: payloadSummary },
31008
- ...message === undefined ? {} : { message },
30919
+ ...dispatchRendered ? { dispatch: dispatchEvent } : {
30920
+ ...summaryIsHead ? {} : { summary: payloadSummary },
30921
+ ...message === undefined ? {} : { message }
30922
+ },
31009
30923
  ...foreignSession === undefined ? {} : {
31010
30924
  note: `body names session ${foreignSession}; the sender is ${envelope.source_session ?? "unknown"}`
31011
30925
  },
package/dist/legion.js CHANGED
@@ -31282,147 +31282,37 @@ var ChildStatusPayloadSchema = object({
31282
31282
  from: string2().optional(),
31283
31283
  to: string2().optional()
31284
31284
  });
31285
- function dispatchActorLabel(actor) {
31286
- return `${actor.kind} ${actor.id ?? "unknown"}`;
31287
- }
31288
- function dispatchBody(event) {
31289
- const lines = [];
31290
- switch (event.type) {
31291
- case "issue.created":
31292
- case "issue.updated":
31293
- case "issue.closed": {
31294
- const parsed = IssuePayloadSchema.safeParse(event.payload);
31295
- if (!parsed.success)
31296
- break;
31297
- if (parsed.data.title)
31298
- lines.push(`Title: ${parsed.data.title}`);
31299
- if (parsed.data.status)
31300
- lines.push(`Status: ${parsed.data.status}`);
31301
- if (parsed.data.route)
31302
- lines.push(`Route: ${parsed.data.route}`);
31303
- break;
31304
- }
31305
- case "artifact.created": {
31306
- const parsed = ArtifactCreatedPayloadSchema.safeParse(event.payload);
31307
- const name = parsed.success ? parsed.data.artifact?.name : undefined;
31308
- if (name)
31309
- lines.push(`Artifact: ${name}`);
31310
- break;
31311
- }
31312
- case "artifact.version": {
31313
- const parsed = ArtifactVersionPayloadSchema.safeParse(event.payload);
31314
- if (!parsed.success)
31315
- break;
31316
- const version = parsed.data.version;
31317
- if (parsed.data.name)
31318
- lines.push(`Artifact: ${parsed.data.name}`);
31319
- if (version?.number !== undefined)
31320
- lines.push(`Version: ${version.number}`);
31321
- if (version?.summary)
31322
- lines.push(`Summary: ${version.summary}`);
31323
- if (parsed.data.diff)
31324
- lines.push("Diff:", parsed.data.diff);
31325
- break;
31326
- }
31327
- case "ask.opened":
31328
- case "ask.answered": {
31329
- const parsed = AskPayloadSchema.safeParse(event.payload);
31330
- if (!parsed.success)
31331
- break;
31332
- if (parsed.data.question)
31333
- lines.push(`Question: ${parsed.data.question}`);
31334
- if (event.type === "ask.opened") {
31335
- const options = (parsed.data.options ?? []).map((option) => option.label).filter((label) => label !== undefined);
31336
- if (options.length > 0)
31337
- lines.push(`Options: ${options.join(", ")}`);
31338
- break;
31339
- }
31340
- const answer = parsed.data.answer;
31341
- lines.push(`Selected: ${answer?.selected?.join(", ") || "none"}`);
31342
- if (answer?.text)
31343
- lines.push(`Text: ${answer.text}`);
31344
- break;
31345
- }
31346
- case "comment.created":
31347
- case "comment.resolved": {
31348
- const parsed = CommentPayloadSchema.safeParse(event.payload);
31349
- if (!parsed.success)
31350
- break;
31351
- const quote = parsed.data.anchor?.quote;
31352
- if (parsed.data.artifact_name)
31353
- lines.push(`Artifact: ${parsed.data.artifact_name}`);
31354
- if (quote)
31355
- lines.push(`> ${quote}`);
31356
- if (parsed.data.reply_to)
31357
- lines.push(`Reply chain: ${parsed.data.reply_to}`);
31358
- if (parsed.data.body)
31359
- lines.push(`Body: ${parsed.data.body}`);
31360
- break;
31361
- }
31362
- case "suggestion.accepted":
31363
- case "suggestion.rejected": {
31364
- const parsed = CommentPayloadSchema.safeParse(event.payload);
31365
- if (!parsed.success)
31366
- break;
31367
- const quote = parsed.data.anchor?.quote;
31368
- const replacement = parsed.data.suggestion?.replace_with;
31369
- if (parsed.data.artifact_name)
31370
- lines.push(`Artifact: ${parsed.data.artifact_name}`);
31371
- if (quote)
31372
- lines.push(`> ${quote}`);
31373
- if (quote && replacement)
31374
- lines.push(`${quote} \u2192 ${replacement}`);
31375
- break;
31376
- }
31377
- case "message.created": {
31378
- const parsed = MessagePayloadSchema.safeParse(event.payload);
31379
- const body = parsed.success ? parsed.data.body : undefined;
31380
- if (body)
31381
- lines.push(`Body: ${body}`);
31382
- break;
31383
- }
31384
- case "child.status": {
31385
- const parsed = ChildStatusPayloadSchema.safeParse(event.payload);
31386
- if (!parsed.success)
31387
- break;
31388
- const { child_key: child, from, to } = parsed.data;
31389
- if (child && from && to)
31390
- lines.push(`Child: ${child} ${from} \u2192 ${to}`);
31391
- break;
31392
- }
31393
- }
31394
- return lines;
31395
- }
31396
- function renderDispatch(envelope, sessionID) {
31397
- const invalid = () => ({
31398
- skip: false,
31399
- content: "dispatch: invalid event",
31400
- envelope
31401
- });
31402
- if (envelope.payload === undefined)
31403
- return invalid();
31404
- let rawEvent;
31285
+ var DISPATCH_PAYLOAD_SCHEMAS = {
31286
+ "issue.created": IssuePayloadSchema,
31287
+ "issue.updated": IssuePayloadSchema,
31288
+ "issue.closed": IssuePayloadSchema,
31289
+ "artifact.created": ArtifactCreatedPayloadSchema,
31290
+ "artifact.version": ArtifactVersionPayloadSchema,
31291
+ "ask.opened": AskPayloadSchema,
31292
+ "ask.answered": AskPayloadSchema,
31293
+ "comment.created": CommentPayloadSchema,
31294
+ "comment.resolved": CommentPayloadSchema,
31295
+ "suggestion.accepted": CommentPayloadSchema,
31296
+ "suggestion.rejected": CommentPayloadSchema,
31297
+ "message.created": MessagePayloadSchema,
31298
+ "child.status": ChildStatusPayloadSchema
31299
+ };
31300
+ function dispatchPayload(event) {
31301
+ const schema = DISPATCH_PAYLOAD_SCHEMAS[event.type];
31302
+ if (schema === undefined)
31303
+ return event.payload;
31304
+ const parsed = schema.safeParse(event.payload);
31305
+ return parsed.success ? parsed.data : event.payload;
31306
+ }
31307
+ function parseDispatchFrame(rawPayload) {
31308
+ let value;
31405
31309
  try {
31406
- rawEvent = JSON.parse(envelope.payload);
31310
+ value = JSON.parse(rawPayload);
31407
31311
  } catch {
31408
- return invalid();
31409
- }
31410
- const parsed = DispatchEventSchema.safeParse(rawEvent);
31411
- if (!parsed.success)
31412
- return invalid();
31413
- const event = parsed.data;
31414
- if (event.actor.kind === "session" && event.actor.id === sessionID) {
31415
- return { skip: true, content: "", envelope };
31312
+ return { raw: rawPayload };
31416
31313
  }
31417
- return {
31418
- skip: false,
31419
- content: [
31420
- `dispatch ${event.issue_key} \xB7 ${event.type} \xB7 by ${dispatchActorLabel(event.actor)}`,
31421
- ...dispatchBody(event)
31422
- ].join(`
31423
- `),
31424
- envelope
31425
- };
31314
+ const parsed = DispatchEventSchema.safeParse(value);
31315
+ return parsed.success ? { event: parsed.data } : { raw: value };
31426
31316
  }
31427
31317
  function inboundTimestamp(milliseconds) {
31428
31318
  if (milliseconds === undefined)
@@ -31458,13 +31348,31 @@ function renderInbound(raw, sessionID, subject) {
31458
31348
  const data = tolerant.data;
31459
31349
  envelope = { ...data, source: data.source ?? "unknown" };
31460
31350
  }
31351
+ let dispatchEvent;
31352
+ let dispatchIssue;
31353
+ const dispatchRendered = envelope.source === "dispatch" && envelope.payload !== undefined;
31461
31354
  if (envelope.source === "dispatch") {
31462
- const renderedDispatch = renderDispatch(envelope, sessionID);
31463
- if (renderedDispatch !== null)
31464
- return renderedDispatch;
31355
+ if (envelope.payload === undefined) {
31356
+ dispatchIssue = "payload";
31357
+ } else {
31358
+ const frame = parseDispatchFrame(envelope.payload);
31359
+ if ("event" in frame) {
31360
+ if (frame.event.actor.kind === "session" && frame.event.actor.id === sessionID) {
31361
+ return { skip: true, content: "", envelope };
31362
+ }
31363
+ dispatchEvent = {
31364
+ issue_key: frame.event.issue_key,
31365
+ type: frame.event.type,
31366
+ actor: frame.event.actor,
31367
+ payload: dispatchPayload(frame.event)
31368
+ };
31369
+ } else {
31370
+ dispatchEvent = frame.raw;
31371
+ }
31372
+ }
31465
31373
  }
31466
31374
  let parsedPayload;
31467
- if (envelope.payload !== undefined && (envelope.source === "github" || envelope.payload !== envelope.payload_summary)) {
31375
+ if (!dispatchRendered && envelope.payload !== undefined && (envelope.source === "github" || envelope.payload !== envelope.payload_summary)) {
31468
31376
  try {
31469
31377
  parsedPayload = JSON.parse(envelope.payload);
31470
31378
  } catch {
@@ -31472,7 +31380,7 @@ function renderInbound(raw, sessionID, subject) {
31472
31380
  }
31473
31381
  }
31474
31382
  const payloadSummary = envelope.payload_summary ?? "unknown";
31475
- const message = envelope.payload !== undefined && envelope.payload !== envelope.payload_summary ? parsedPayload : undefined;
31383
+ const message = !dispatchRendered && envelope.payload !== undefined && envelope.payload !== envelope.payload_summary ? parsedPayload : undefined;
31476
31384
  const summaryIsHead = typeof message === "string" && envelope.payload_summary !== undefined && message.startsWith(envelope.payload_summary.endsWith("\u2026") ? envelope.payload_summary.slice(0, -1) : envelope.payload_summary);
31477
31385
  const body = `${envelope.payload_summary ?? ""}
31478
31386
  ${envelope.payload ?? ""}`;
@@ -31486,7 +31394,11 @@ ${envelope.payload ?? ""}`;
31486
31394
  const role = envelope.sender?.roles?.[0];
31487
31395
  const reply = replyWith(envelope);
31488
31396
  const sourceIssue = parseIssues.includes("source") || KNOWN_SOURCES[envelope.source] !== undefined ? undefined : `source=${envelope.source}`;
31489
- const unrecognised = [...parseIssues, ...sourceIssue === undefined ? [] : [sourceIssue]].join(", ") || undefined;
31397
+ const unrecognised = [
31398
+ ...parseIssues,
31399
+ ...sourceIssue === undefined ? [] : [sourceIssue],
31400
+ ...dispatchIssue === undefined ? [] : [dispatchIssue]
31401
+ ].join(", ") || undefined;
31490
31402
  const rendered = {
31491
31403
  ...envelope.topic === agentSubject(sessionID) ? { to: `you (${sessionID.slice(0, 4)}\u2026)` } : {},
31492
31404
  from: senderLabel(envelope),
@@ -31501,8 +31413,10 @@ ${envelope.payload ?? ""}`;
31501
31413
  ...role === undefined ? {} : {
31502
31414
  reply_role: `envoy_publish(topic="notifications.role.${role}", message="...")`
31503
31415
  },
31504
- ...summaryIsHead ? {} : { summary: payloadSummary },
31505
- ...message === undefined ? {} : { message },
31416
+ ...dispatchRendered ? { dispatch: dispatchEvent } : {
31417
+ ...summaryIsHead ? {} : { summary: payloadSummary },
31418
+ ...message === undefined ? {} : { message }
31419
+ },
31506
31420
  ...foreignSession === undefined ? {} : {
31507
31421
  note: `body names session ${foreignSession}; the sender is ${envelope.source_session ?? "unknown"}`
31508
31422
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sjawhar/pi-legion-envoy",
3
- "version": "0.16.0",
3
+ "version": "0.16.1",
4
4
  "type": "module",
5
5
  "omp": {
6
6
  "extensions": [