@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.
- package/README.md +2 -0
- package/dist/remy.js +133 -1
- 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.
|
|
40269
|
+
var remyCliVersion = "1.19.0-rc.0";
|
|
40138
40270
|
async function showRemySplash({
|
|
40139
40271
|
createRenderer = createRemyRenderer,
|
|
40140
40272
|
durationMs = splashDurationMs,
|