@meistrari/remy-cli 1.18.0 → 1.19.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +2 -0
  2. package/dist/remy.js +133 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -62,6 +62,8 @@ Subagent work appears as named **Subagent · <name>** activity rather than messa
62
62
 
63
63
  Published files and Tela Pages appear in the timeline. File artifacts include their full Web preview URL; Tela Page rows include their title and canonical URL so you can open them directly from the terminal. Remy does not request or expose the Web-only temporary iframe capability for Tela Pages.
64
64
 
65
+ System observations appear as **system notifications** with the system actor, source, and a generic JSON data view. Remy preserves unknown actor IDs and notification formats rather than treating them as user messages or commands. When a notification starts agent work, retained history can associate it with a known accepted Remy turn without adding a synthetic prompt. Delivery is at-least-once, so an uncertain retry can produce additional distinct turns and repeat model or tool effects; Remy preserves those turns rather than presenting the association as proof of exactly-once execution. The CLI has no control for creating notifications.
66
+
65
67
  When Remy creates a plan, the session shows its checklist in the timeline and keeps `Plan <done>/<total>` with the current item pinned above the composer. Updates change the same checklist instead of producing repeated rows, and an unfinished plan remains visible after reconnecting or between turns. The collapsed timeline shows up to five plan items; press `Ctrl+O` for the complete checklist and activity detail.
66
68
 
67
69
  Press `Ctrl+O` to inspect tool output, including partial output from failed tools. Ordinary tools keep a single text-output block. MCP tools show ordered text and JSON blocks with separate labels; structured content appears in its own section unless it is null or absent. MCP images, audio, and embedded binary resources show media details instead of base64. Each expanded activity includes a **View event in Web** link when the server supplies its Web URL. Follow it to open the exact retained event and its output, including older or child-agent activity. The full URL remains visible for copying when your terminal does not support clickable links. Older servers without a Web URL show an explicit unavailable message instead of a guessed link. Resource links remain references, not a promise that their targets are accessible. Additional background-tool output appears as a correlated update without replacing the earlier result.
package/dist/remy.js CHANGED
@@ -32249,6 +32249,27 @@ function decodeJsonKey(value) {
32249
32249
  return value.slice(JSON_VALIDATION_KEY_PREFIX.length);
32250
32250
  }
32251
32251
 
32252
+ // ../../packages/agents-protocol/src/agent-notification.ts
32253
+ var agentNotificationSchema = jsonValueSchema;
32254
+ var agentNotificationsSchema = zod_default2.array(agentNotificationSchema).min(1).max(20);
32255
+ var agentNotificationToolOutputMaxBytes = 64 * 1024;
32256
+ var textEncoder = new TextEncoder;
32257
+ function isAgentNotificationToolOutputWithinSizeLimit(input) {
32258
+ return textEncoder.encode(JSON.stringify(input)).byteLength <= agentNotificationToolOutputMaxBytes;
32259
+ }
32260
+ var agentNotificationToolOutputSchema = zod_default2.object({
32261
+ commandId: zod_default2.string().min(1),
32262
+ notifications: agentNotificationsSchema
32263
+ }).strict().superRefine((output, context) => {
32264
+ if (isAgentNotificationToolOutputWithinSizeLimit(output))
32265
+ return;
32266
+ context.addIssue({
32267
+ code: "custom",
32268
+ path: ["notifications"],
32269
+ message: `Serialized notification tool output exceeds ${agentNotificationToolOutputMaxBytes} bytes.`
32270
+ });
32271
+ });
32272
+
32252
32273
  // ../../packages/agents-protocol/src/agent-user-input.ts
32253
32274
  var agentUserInputOptionSchema = zod_default2.object({
32254
32275
  value: zod_default2.string().min(1),
@@ -32297,6 +32318,23 @@ var sendPromptCommandSchema = runningCommandBaseSchema.extend({
32297
32318
  commandId: commandIdSchema,
32298
32319
  author: agentAuthorSchema.optional()
32299
32320
  }).strict();
32321
+ var agentNotifyCommandSchema = runningCommandBaseSchema.extend({
32322
+ type: zod_default2.literal("agent.notify"),
32323
+ commandId: commandIdSchema,
32324
+ notifications: agentNotificationsSchema
32325
+ }).strict().superRefine((command, context) => {
32326
+ if (isAgentNotificationToolOutputWithinSizeLimit({
32327
+ commandId: command.commandId,
32328
+ notifications: command.notifications
32329
+ })) {
32330
+ return;
32331
+ }
32332
+ context.addIssue({
32333
+ code: "custom",
32334
+ path: ["notifications"],
32335
+ message: "Serialized notification tool output exceeds the allowed size."
32336
+ });
32337
+ });
32300
32338
  var interruptAgentCommandSchema = runningCommandBaseSchema.extend({
32301
32339
  type: zod_default2.literal("agent.interrupt"),
32302
32340
  commandId: commandIdSchema,
@@ -32319,6 +32357,7 @@ var respondUserInputAgentCommandSchema = runningCommandBaseSchema.extend({
32319
32357
  }).strict();
32320
32358
  var agentCommandSchema = zod_default2.union([
32321
32359
  sendPromptCommandSchema,
32360
+ agentNotifyCommandSchema,
32322
32361
  interruptAgentCommandSchema,
32323
32362
  compactContextAgentCommandSchema,
32324
32363
  stopAgentCommandSchema,
@@ -34317,6 +34356,30 @@ var sessionMessageTurnAssociatedEventSchema = exports_external2.object({
34317
34356
  type: exports_external2.literal("session.message.turn-associated"),
34318
34357
  payload: exports_external2.object({ messageId: exports_external2.string().min(1), commandId: exports_external2.string().min(1), turnId: exports_external2.string().min(1) }).passthrough()
34319
34358
  }).passthrough();
34359
+ var sessionNotificationCreatedEventSchema = exports_external2.strictObject({
34360
+ type: exports_external2.literal("session.notification.created"),
34361
+ payload: exports_external2.strictObject({
34362
+ commandId: exports_external2.string().min(1),
34363
+ creator: exports_external2.strictObject({
34364
+ type: exports_external2.literal("system"),
34365
+ id: exports_external2.string().min(1).max(80),
34366
+ name: exports_external2.string().min(1).max(255)
34367
+ }),
34368
+ source: exports_external2.strictObject({
34369
+ provider: exports_external2.string().min(1).max(50),
34370
+ label: exports_external2.string().min(1).max(255),
34371
+ url: exports_external2.string().nullable()
34372
+ }),
34373
+ notifications: exports_external2.array(jsonValueSchema).min(1).max(20)
34374
+ })
34375
+ });
34376
+ var sessionNotificationTurnAssociatedEventSchema = exports_external2.strictObject({
34377
+ type: exports_external2.literal("session.notification.turn-associated"),
34378
+ payload: exports_external2.strictObject({
34379
+ commandId: exports_external2.string().min(1),
34380
+ turnId: exports_external2.string().min(1)
34381
+ })
34382
+ });
34320
34383
  var sessionMessageDispatchEventSchema = exports_external2.object({
34321
34384
  type: exports_external2.enum(["session.message.dispatched", "session.message.withdrawn", "session.message.failed"]),
34322
34385
  payload: exports_external2.object({ messageId: exports_external2.string().min(1), commandId: exports_external2.string().min(1) }).passthrough()
@@ -34404,6 +34467,7 @@ function createSessionViewState({ detail, activeMessageId }) {
34404
34467
  work: { items: [] },
34405
34468
  workTurnBaselines: {},
34406
34469
  messageTurns: {},
34470
+ notificationTurns: {},
34407
34471
  retainedTurnStarts: {},
34408
34472
  retainedTurnEnds: {},
34409
34473
  childLineage: {
@@ -34494,6 +34558,18 @@ function projectRetainedEvent({
34494
34558
  throw new SessionProjectionProtocolError("Invalid session.title.generated event.");
34495
34559
  return state;
34496
34560
  }
34561
+ if (event.type === "session.notification.created") {
34562
+ const notificationCreated = sessionNotificationCreatedEventSchema.safeParse(event);
34563
+ if (!notificationCreated.success)
34564
+ throw new SessionProjectionProtocolError("Invalid session.notification.created event.");
34565
+ return projectSessionNotificationCreated({ state, event: notificationCreated.data, occurredAt, eventUrl });
34566
+ }
34567
+ if (event.type === "session.notification.turn-associated") {
34568
+ const notificationTurnAssociated = sessionNotificationTurnAssociatedEventSchema.safeParse(event);
34569
+ if (!notificationTurnAssociated.success)
34570
+ throw new SessionProjectionProtocolError("Invalid session.notification.turn-associated event.");
34571
+ return projectSessionNotificationTurnAssociated({ state, event: notificationTurnAssociated.data });
34572
+ }
34497
34573
  const messageCreated = sessionMessageCreatedEventSchema.safeParse(event);
34498
34574
  const turnAssociated = sessionMessageTurnAssociatedEventSchema.safeParse(event);
34499
34575
  const messageDispatch = sessionMessageDispatchEventSchema.safeParse(event);
@@ -34530,6 +34606,42 @@ function projectRetainedEvent({
34530
34606
  }
34531
34607
  return projected;
34532
34608
  }
34609
+ function projectSessionNotificationCreated({
34610
+ state,
34611
+ event,
34612
+ occurredAt,
34613
+ eventUrl
34614
+ }) {
34615
+ if (state.transcript.some((item) => item.kind === "notification" && item.commandId === event.payload.commandId))
34616
+ return state;
34617
+ const turnId = state.notificationTurns?.[event.payload.commandId];
34618
+ return {
34619
+ ...state,
34620
+ transcript: [...state.transcript, {
34621
+ kind: "notification",
34622
+ commandId: event.payload.commandId,
34623
+ ...turnId === undefined ? {} : { turnId },
34624
+ ...eventUrl === undefined ? {} : { eventUrl },
34625
+ occurredAt,
34626
+ creator: event.payload.creator,
34627
+ source: event.payload.source,
34628
+ notifications: event.payload.notifications
34629
+ }]
34630
+ };
34631
+ }
34632
+ function projectSessionNotificationTurnAssociated({
34633
+ state,
34634
+ event
34635
+ }) {
34636
+ return {
34637
+ ...state,
34638
+ notificationTurns: {
34639
+ ...state.notificationTurns,
34640
+ [event.payload.commandId]: event.payload.turnId
34641
+ },
34642
+ transcript: state.transcript.map((item) => item.kind === "notification" && item.commandId === event.payload.commandId ? { ...item, turnId: event.payload.turnId } : item)
34643
+ };
34644
+ }
34533
34645
  function projectSessionMessageCreated({ state, event, occurredAt }) {
34534
34646
  if (state.transcript.some((item) => item.kind === "message" && item.messageId === event.payload.messageId))
34535
34647
  return state;
@@ -39520,6 +39632,26 @@ function renderTimeline({ state, activityExpanded }) {
39520
39632
  `);
39521
39633
  }
39522
39634
  function renderTimelineItem(item, activityExpanded) {
39635
+ if (item.kind === "notification") {
39636
+ const actorId = terminalSafeText(item.creator.id).replace(/\s+/g, " ").trim();
39637
+ const actorName = terminalSafeText(item.creator.name).replace(/\s+/g, " ").trim() || actorId;
39638
+ const sourceProvider = terminalSafeText(item.source.provider).replace(/\s+/g, " ").trim();
39639
+ const sourceLabel = terminalSafeText(item.source.label).replace(/\s+/g, " ").trim() || sourceProvider;
39640
+ const sourceUrl = item.source.url ? terminalSafeText(item.source.url) : null;
39641
+ const notificationData = JSON.stringify(item.notifications, null, 2);
39642
+ return joinStyled([
39643
+ new StyledText8([
39644
+ renderTimestampChunk(item.occurredAt),
39645
+ renderRoleLabel({ label: actorName, role: "system" }),
39646
+ dim7(fg10(PALETTE.dimText)(` \xB7 System notification (${sourceLabel})`))
39647
+ ]),
39648
+ new StyledText8([dim7(fg10(PALETTE.dimText)(`Actor ID: ${actorId} \xB7 Source: ${sourceProvider}`))]),
39649
+ ...sourceUrl ? [new StyledText8([dim7(fg10(PALETTE.dimText)(`Source URL: ${sourceUrl}`))])] : [],
39650
+ new StyledText8([fg10(PALETTE.dimText)(notificationData)]),
39651
+ ...item.eventUrl ? [new StyledText8([dim7(fg10(PALETTE.dimText)(`View event in Web: ${item.eventUrl}`))])] : []
39652
+ ], `
39653
+ `);
39654
+ }
39523
39655
  if (item.kind === "message") {
39524
39656
  const header = new StyledText8([
39525
39657
  renderTimestampChunk(item.occurredAt),
@@ -40134,7 +40266,7 @@ var compactMarkRows = 9;
40134
40266
  var compactMinWidth = 48;
40135
40267
  var compactMinHeight = 20;
40136
40268
  var markBrightnessGain = 4.2;
40137
- var remyCliVersion = "1.18.0";
40269
+ var remyCliVersion = "1.19.0-rc.0";
40138
40270
  async function showRemySplash({
40139
40271
  createRenderer = createRemyRenderer,
40140
40272
  durationMs = splashDurationMs,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/remy-cli",
3
- "version": "1.18.0",
3
+ "version": "1.19.0-rc.0",
4
4
  "description": "Remy, the Coding Agent terminal client.",
5
5
  "type": "module",
6
6
  "bin": {