@meistrari/remy-cli 1.6.0 → 1.8.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 +75 -43
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -44,6 +44,8 @@ Use `Tab` while writing the request to complete a local file path. Remy attaches
44
44
 
45
45
  Use Up/Down to select a session in the dashboard, Left/Right to load the adjacent page, and `Enter` to open it. After the dashboard list or repository-review list has focus, Vim keys work too: `j`/`k` move, `h`/`l` go to the previous/next dashboard page (or clear/mark a repository), `G` goes to the last row, and `gg` goes to the first row. Press `Shift+L` in the dashboard to start a logout confirmation. In a session, type a follow-up and press `Enter` to send it.
46
46
 
47
+ Published files and Tela Pages appear in the timeline. A Tela Page row includes its title and canonical URL so you can open it directly from the terminal.
48
+
47
49
  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.
48
50
 
49
51
  Drag to select visible text in any Remy view; Remy copies it to the local clipboard and emits OSC 52 for terminal or remote-session clipboard support, then clears the selection highlight. When the conversation has focus, press `Tab` to return to the composer.
package/dist/remy.js CHANGED
@@ -32607,6 +32607,38 @@ var selectableAgentReasoningEfforts = ["low", "medium", "high", "xhigh"];
32607
32607
  // ../../packages/coding-agent-client/src/sessions.ts
32608
32608
  var reasoningEffortSchema = exports_external2.enum(selectableAgentReasoningEfforts);
32609
32609
  var sessionStatusSchema = exports_external2.enum(["open", "completed", "failed", "cancelled"]);
32610
+ var sessionArtifactPresentationSchema = exports_external2.discriminatedUnion("type", [
32611
+ exports_external2.strictObject({ type: exports_external2.literal("image"), caption: exports_external2.string(), alt_text: exports_external2.string() }),
32612
+ exports_external2.strictObject({ type: exports_external2.literal("video"), title: exports_external2.string(), description: exports_external2.string() }),
32613
+ exports_external2.strictObject({ type: exports_external2.literal("file"), title: exports_external2.string(), description: exports_external2.string() })
32614
+ ]);
32615
+ var sessionFileArtifactEventSchema = exports_external2.strictObject({
32616
+ kind: exports_external2.literal("file"),
32617
+ artifact_id: exports_external2.string(),
32618
+ filename: exports_external2.string(),
32619
+ media_type: exports_external2.string(),
32620
+ byte_size: exports_external2.number().int().positive(),
32621
+ presentation: sessionArtifactPresentationSchema
32622
+ });
32623
+ var sessionTelaPageArtifactEventSchema = exports_external2.strictObject({
32624
+ kind: exports_external2.literal("tela_page"),
32625
+ artifact_id: exports_external2.string(),
32626
+ site: exports_external2.string(),
32627
+ title: exports_external2.string(),
32628
+ summary: exports_external2.string().nullable(),
32629
+ surface: exports_external2.enum(["document", "deployed"]),
32630
+ outcome: exports_external2.enum(["created", "updated", "unchanged"]),
32631
+ url: exports_external2.url(),
32632
+ published_at: exports_external2.iso.datetime()
32633
+ });
32634
+ var sessionArtifactEventSchema = exports_external2.discriminatedUnion("kind", [
32635
+ sessionFileArtifactEventSchema,
32636
+ sessionTelaPageArtifactEventSchema
32637
+ ]);
32638
+ var sessionArtifactSchema = exports_external2.discriminatedUnion("kind", [
32639
+ sessionFileArtifactEventSchema.extend({ download_url: exports_external2.string() }),
32640
+ sessionTelaPageArtifactEventSchema.extend({ preview_url: exports_external2.string() })
32641
+ ]);
32610
32642
  var sessionMessageSchema = exports_external2.strictObject({
32611
32643
  id: exports_external2.string(),
32612
32644
  sequence: exports_external2.number().int().positive(),
@@ -32677,15 +32709,6 @@ var interruptSessionResponseSchema = exports_external2.strictObject({
32677
32709
  type: exports_external2.literal("agent.interrupt")
32678
32710
  })
32679
32711
  });
32680
- var sessionPullRequestSchema = exports_external2.strictObject({
32681
- id: exports_external2.string(),
32682
- repository_id: exports_external2.string(),
32683
- number: exports_external2.number().int().positive(),
32684
- title: exports_external2.string(),
32685
- url: exports_external2.string(),
32686
- status: exports_external2.enum(["open", "closed", "merged"]),
32687
- draft: exports_external2.boolean()
32688
- });
32689
32712
  var sessionDetailResponseSchema = exports_external2.object({
32690
32713
  id: exports_external2.string(),
32691
32714
  status: sessionStatusSchema,
@@ -32704,18 +32727,9 @@ var sessionDetailResponseSchema = exports_external2.object({
32704
32727
  id: exports_external2.string(),
32705
32728
  full_name: exports_external2.string()
32706
32729
  })),
32707
- connections: exports_external2.array(sessionConnectionSchema).max(1)
32730
+ connections: exports_external2.array(sessionConnectionSchema).max(1),
32731
+ artifacts: exports_external2.array(sessionArtifactSchema)
32708
32732
  }).passthrough();
32709
- var sessionLifecycleResponseSchema = exports_external2.object({
32710
- id: exports_external2.string(),
32711
- status: sessionStatusSchema,
32712
- repositories: exports_external2.array(exports_external2.strictObject({
32713
- id: exports_external2.string(),
32714
- full_name: exports_external2.string()
32715
- })),
32716
- pull_requests: exports_external2.array(sessionPullRequestSchema),
32717
- connections: exports_external2.array(sessionConnectionSchema).max(1)
32718
- });
32719
32733
  var sessionSourceSchema = exports_external2.discriminatedUnion("provider", [
32720
32734
  exports_external2.object({
32721
32735
  provider: exports_external2.literal("slack"),
@@ -32757,6 +32771,10 @@ var sessionSummarySchema = exports_external2.object({
32757
32771
  created_at: exports_external2.string(),
32758
32772
  updated_at: exports_external2.string().nullable()
32759
32773
  });
32774
+ var telaPagePreviewGrantSchema = exports_external2.strictObject({
32775
+ url: exports_external2.url(),
32776
+ expires_at: exports_external2.iso.datetime()
32777
+ });
32760
32778
  var sessionListResponseSchema = exports_external2.strictObject({
32761
32779
  data: exports_external2.array(sessionSummarySchema),
32762
32780
  has_more: exports_external2.boolean(),
@@ -32848,14 +32866,14 @@ async function interruptSession({
32848
32866
  }
32849
32867
  async function completeSession({ client, sessionId }) {
32850
32868
  const response = await client.request(`/v1/sessions/${encodeURIComponent(sessionId)}/complete`, { method: "PUT" });
32851
- const parsed = sessionLifecycleResponseSchema.safeParse(await parseJson2(response, "Session completion response was not valid JSON."));
32869
+ const parsed = sessionDetailResponseSchema.safeParse(await parseJson2(response, "Session completion response was not valid JSON."));
32852
32870
  if (!parsed.success)
32853
32871
  throw new CodingAgentProtocolError("Session completion response did not match the public API contract.", { cause: parsed.error });
32854
32872
  return parsed.data;
32855
32873
  }
32856
32874
  async function cancelSession({ client, sessionId }) {
32857
32875
  const response = await client.request(`/v1/sessions/${encodeURIComponent(sessionId)}/cancel`, { method: "PUT" });
32858
- const parsed = sessionLifecycleResponseSchema.safeParse(await parseJson2(response, "Session cancellation response was not valid JSON."));
32876
+ const parsed = sessionDetailResponseSchema.safeParse(await parseJson2(response, "Session cancellation response was not valid JSON."));
32859
32877
  if (!parsed.success)
32860
32878
  throw new CodingAgentProtocolError("Session cancellation response did not match the public API contract.", { cause: parsed.error });
32861
32879
  return parsed.data;
@@ -32933,19 +32951,13 @@ function parseAppendSessionMessageResponse(body) {
32933
32951
  // ../../packages/coding-agent-client/src/session-events.ts
32934
32952
  var retainedEventBodySchema = exports_external2.object({ type: exports_external2.string().min(1) }).passthrough();
32935
32953
  var ephemeralEventBodySchema = exports_external2.object({ type: exports_external2.string().min(1) }).passthrough();
32936
- var publishedAttachmentSchema = exports_external2.object({
32937
- artifact_id: exports_external2.string(),
32938
- filename: exports_external2.string(),
32939
- media_type: exports_external2.string(),
32940
- byte_size: exports_external2.number().int().nonnegative()
32941
- }).passthrough();
32942
32954
  var retainedSessionEventSchema = exports_external2.object({
32943
32955
  id: exports_external2.string(),
32944
32956
  history_sequence: exports_external2.number().int().positive(),
32945
32957
  occurred_at: exports_external2.iso.datetime(),
32946
32958
  recorded_at: exports_external2.iso.datetime(),
32947
32959
  event: retainedEventBodySchema,
32948
- attachment: publishedAttachmentSchema.optional()
32960
+ artifact: sessionArtifactEventSchema.optional()
32949
32961
  }).strict();
32950
32962
  var ephemeralSessionEventSchema = exports_external2.object({
32951
32963
  occurred_at: exports_external2.iso.datetime(),
@@ -33930,7 +33942,7 @@ function projectRemoteSessionEvent({ state, frame }) {
33930
33942
  event: frame.data.event,
33931
33943
  occurredAt: frame.data.occurred_at,
33932
33944
  retainedEventId: frame.id,
33933
- attachment: frame.data.attachment
33945
+ artifact: frame.data.artifact
33934
33946
  });
33935
33947
  return {
33936
33948
  ...projected,
@@ -33968,7 +33980,7 @@ function projectRetainedEvent({
33968
33980
  event,
33969
33981
  occurredAt,
33970
33982
  retainedEventId,
33971
- attachment
33983
+ artifact
33972
33984
  }) {
33973
33985
  const messageCreated = sessionMessageCreatedEventSchema.safeParse(event);
33974
33986
  const turnAssociated = sessionMessageTurnAssociatedEventSchema.safeParse(event);
@@ -33976,17 +33988,28 @@ function projectRetainedEvent({
33976
33988
  const workspaceGitRevision = sessionWorkspaceGitRevisionEventSchema.safeParse(event);
33977
33989
  const turnEnded = agentTurnEndedEventSchema.safeParse(event);
33978
33990
  let projected = messageCreated.success ? projectSessionMessageCreated({ state, event: messageCreated.data, occurredAt }) : turnAssociated.success ? projectSessionMessageTurnAssociated({ state, event: turnAssociated.data }) : workspaceGitInitialized.success ? projectSessionWorkspaceGitInitialized({ state, event: workspaceGitInitialized.data, occurredAt, retainedEventId }) : workspaceGitRevision.success ? projectSessionWorkspaceGitRevision({ state, event: workspaceGitRevision.data, occurredAt, retainedEventId }) : turnEnded.success ? projectAgentTurnEnded({ state, event: turnEnded.data, occurredAt, retainedEventId }) : projectDurableAgentEvent({ state, event, occurredAt, retainedEventId });
33979
- if (attachment) {
33991
+ if (artifact) {
33992
+ const publication = artifact.kind === "file" ? { artifactId: artifact.artifact_id, kind: artifact.kind, title: artifact.filename } : { artifactId: artifact.artifact_id, kind: artifact.kind, title: artifact.title, url: artifact.url };
33993
+ const timelineArtifact = artifact.kind === "file" ? {
33994
+ kind: "artifact",
33995
+ artifactKind: artifact.kind,
33996
+ artifactId: artifact.artifact_id,
33997
+ occurredAt,
33998
+ title: artifact.filename,
33999
+ mediaType: artifact.media_type
34000
+ } : {
34001
+ kind: "artifact",
34002
+ artifactKind: artifact.kind,
34003
+ artifactId: artifact.artifact_id,
34004
+ occurredAt,
34005
+ title: artifact.title,
34006
+ site: artifact.site,
34007
+ url: artifact.url
34008
+ };
33980
34009
  projected = {
33981
34010
  ...projected,
33982
- publications: [...projected.publications, { artifactId: attachment.artifact_id, filename: attachment.filename }],
33983
- transcript: [...projected.transcript, {
33984
- kind: "artifact",
33985
- artifactId: attachment.artifact_id,
33986
- occurredAt,
33987
- filename: attachment.filename,
33988
- mediaType: attachment.media_type
33989
- }]
34011
+ publications: [...projected.publications, publication],
34012
+ transcript: [...projected.transcript, timelineArtifact]
33990
34013
  };
33991
34014
  }
33992
34015
  return projected;
@@ -37200,10 +37223,18 @@ function renderTimelineItem(item, activityExpanded) {
37200
37223
  }
37201
37224
  if (item.kind === "plan")
37202
37225
  return renderPlan({ item, expanded: activityExpanded });
37226
+ if (item.artifactKind === "tela_page") {
37227
+ return new StyledText5([
37228
+ renderTimestampChunk(item.occurredAt),
37229
+ bold4(fg6(PALETTE.tool)("Tela Page: ")),
37230
+ fg6(PALETTE.bodyText)(item.title),
37231
+ dim4(fg6(PALETTE.dimText)(` \xB7 ${item.url}`))
37232
+ ]);
37233
+ }
37203
37234
  return new StyledText5([
37204
37235
  renderTimestampChunk(item.occurredAt),
37205
37236
  bold4(fg6(PALETTE.tool)("Artifact: ")),
37206
- fg6(PALETTE.bodyText)(item.filename)
37237
+ fg6(PALETTE.bodyText)(item.title)
37207
37238
  ]);
37208
37239
  }
37209
37240
  var collapsedPlanItemLimit = 5;
@@ -37514,7 +37545,7 @@ var compactMarkRows = 9;
37514
37545
  var compactMinWidth = 48;
37515
37546
  var compactMinHeight = 20;
37516
37547
  var markBrightnessGain = 4.2;
37517
- var remyCliVersion = "1.6.0";
37548
+ var remyCliVersion = "1.8.0";
37518
37549
  async function showRemySplash({
37519
37550
  createRenderer = createRemyRenderer,
37520
37551
  durationMs = splashDurationMs,
@@ -38643,7 +38674,8 @@ async function attachCreatedSession({
38643
38674
  status: created.session.status,
38644
38675
  repositories: sessionRepositories.map((repository) => ({ id: repository.id, full_name: repository.fullName })),
38645
38676
  pull_requests: [],
38646
- connections: created.connections
38677
+ connections: created.connections,
38678
+ artifacts: []
38647
38679
  }
38648
38680
  },
38649
38681
  noTui,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meistrari/remy-cli",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Remy, the Coding Agent terminal client.",
5
5
  "type": "module",
6
6
  "bin": {