replicas-cli 0.2.283 → 0.2.284

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/index.mjs CHANGED
@@ -1473,7 +1473,7 @@ var require_stringify = __commonJS({
1473
1473
  props.push(doc.directives.tagString(tag));
1474
1474
  return props.join(" ");
1475
1475
  }
1476
- function stringify2(item, ctx, onComment, onChompKeep) {
1476
+ function stringify(item, ctx, onComment, onChompKeep) {
1477
1477
  if (identity.isPair(item))
1478
1478
  return item.toString(ctx, onComment, onChompKeep);
1479
1479
  if (identity.isAlias(item)) {
@@ -1502,7 +1502,7 @@ var require_stringify = __commonJS({
1502
1502
  ${ctx.indent}${str}`;
1503
1503
  }
1504
1504
  exports.createStringifyContext = createStringifyContext;
1505
- exports.stringify = stringify2;
1505
+ exports.stringify = stringify;
1506
1506
  }
1507
1507
  });
1508
1508
 
@@ -1512,7 +1512,7 @@ var require_stringifyPair = __commonJS({
1512
1512
  "use strict";
1513
1513
  var identity = require_identity();
1514
1514
  var Scalar = require_Scalar();
1515
- var stringify2 = require_stringify();
1515
+ var stringify = require_stringify();
1516
1516
  var stringifyComment = require_stringifyComment();
1517
1517
  function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
1518
1518
  const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;
@@ -1534,7 +1534,7 @@ var require_stringifyPair = __commonJS({
1534
1534
  });
1535
1535
  let keyCommentDone = false;
1536
1536
  let chompKeep = false;
1537
- let str = stringify2.stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true);
1537
+ let str = stringify.stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true);
1538
1538
  if (!explicitKey && !ctx.inFlow && str.length > 1024) {
1539
1539
  if (simpleKeys)
1540
1540
  throw new Error("With simple keys, single line scalar must not span more than 1024 characters");
@@ -1586,7 +1586,7 @@ ${indent}:`;
1586
1586
  ctx.indent = ctx.indent.substring(2);
1587
1587
  }
1588
1588
  let valueCommentDone = false;
1589
- const valueStr = stringify2.stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true);
1589
+ const valueStr = stringify.stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true);
1590
1590
  let ws = " ";
1591
1591
  if (keyComment || vsb || vcb) {
1592
1592
  ws = vsb ? "\n" : "";
@@ -1727,7 +1727,7 @@ var require_addPairToJSMap = __commonJS({
1727
1727
  "use strict";
1728
1728
  var log = require_log();
1729
1729
  var merge = require_merge();
1730
- var stringify2 = require_stringify();
1730
+ var stringify = require_stringify();
1731
1731
  var identity = require_identity();
1732
1732
  var toJS = require_toJS();
1733
1733
  function addPairToJSMap(ctx, map, { key, value }) {
@@ -1763,7 +1763,7 @@ var require_addPairToJSMap = __commonJS({
1763
1763
  if (typeof jsKey !== "object")
1764
1764
  return String(jsKey);
1765
1765
  if (identity.isNode(key) && ctx?.doc) {
1766
- const strCtx = stringify2.createStringifyContext(ctx.doc, {});
1766
+ const strCtx = stringify.createStringifyContext(ctx.doc, {});
1767
1767
  strCtx.anchors = /* @__PURE__ */ new Set();
1768
1768
  for (const node of ctx.anchors.keys())
1769
1769
  strCtx.anchors.add(node.anchor);
@@ -1830,12 +1830,12 @@ var require_stringifyCollection = __commonJS({
1830
1830
  "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js"(exports) {
1831
1831
  "use strict";
1832
1832
  var identity = require_identity();
1833
- var stringify2 = require_stringify();
1833
+ var stringify = require_stringify();
1834
1834
  var stringifyComment = require_stringifyComment();
1835
1835
  function stringifyCollection(collection, ctx, options) {
1836
1836
  const flow = ctx.inFlow ?? collection.flow;
1837
- const stringify3 = flow ? stringifyFlowCollection : stringifyBlockCollection;
1838
- return stringify3(collection, ctx, options);
1837
+ const stringify2 = flow ? stringifyFlowCollection : stringifyBlockCollection;
1838
+ return stringify2(collection, ctx, options);
1839
1839
  }
1840
1840
  function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {
1841
1841
  const { indent, options: { commentString } } = ctx;
@@ -1860,7 +1860,7 @@ var require_stringifyCollection = __commonJS({
1860
1860
  }
1861
1861
  }
1862
1862
  chompKeep = false;
1863
- let str2 = stringify2.stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true);
1863
+ let str2 = stringify.stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true);
1864
1864
  if (comment2)
1865
1865
  str2 += stringifyComment.lineComment(str2, itemIndent, commentString(comment2));
1866
1866
  if (chompKeep && comment2)
@@ -1927,7 +1927,7 @@ ${indent}${line}` : "\n";
1927
1927
  }
1928
1928
  if (comment)
1929
1929
  reqNewline = true;
1930
- let str = stringify2.stringify(item, itemCtx, () => comment = null);
1930
+ let str = stringify.stringify(item, itemCtx, () => comment = null);
1931
1931
  reqNewline || (reqNewline = lines.length > linesAtValue || str.includes("\n"));
1932
1932
  if (i < items.length - 1) {
1933
1933
  str += ",";
@@ -3288,7 +3288,7 @@ var require_stringifyDocument = __commonJS({
3288
3288
  "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js"(exports) {
3289
3289
  "use strict";
3290
3290
  var identity = require_identity();
3291
- var stringify2 = require_stringify();
3291
+ var stringify = require_stringify();
3292
3292
  var stringifyComment = require_stringifyComment();
3293
3293
  function stringifyDocument(doc, options) {
3294
3294
  const lines = [];
@@ -3303,7 +3303,7 @@ var require_stringifyDocument = __commonJS({
3303
3303
  }
3304
3304
  if (hasDirectives)
3305
3305
  lines.push("---");
3306
- const ctx = stringify2.createStringifyContext(doc, options);
3306
+ const ctx = stringify.createStringifyContext(doc, options);
3307
3307
  const { commentString } = ctx.options;
3308
3308
  if (doc.commentBefore) {
3309
3309
  if (lines.length !== 1)
@@ -3325,7 +3325,7 @@ var require_stringifyDocument = __commonJS({
3325
3325
  contentComment = doc.contents.comment;
3326
3326
  }
3327
3327
  const onChompKeep = contentComment ? void 0 : () => chompKeep = true;
3328
- let body = stringify2.stringify(doc.contents, ctx, () => contentComment = null, onChompKeep);
3328
+ let body = stringify.stringify(doc.contents, ctx, () => contentComment = null, onChompKeep);
3329
3329
  if (contentComment)
3330
3330
  body += stringifyComment.lineComment(body, "", commentString(contentComment));
3331
3331
  if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") {
@@ -3333,7 +3333,7 @@ var require_stringifyDocument = __commonJS({
3333
3333
  } else
3334
3334
  lines.push(body);
3335
3335
  } else {
3336
- lines.push(stringify2.stringify(doc.contents, ctx));
3336
+ lines.push(stringify.stringify(doc.contents, ctx));
3337
3337
  }
3338
3338
  if (doc.directives?.docEnd) {
3339
3339
  if (doc.comment) {
@@ -5468,7 +5468,7 @@ var require_cst_scalar = __commonJS({
5468
5468
  var require_cst_stringify = __commonJS({
5469
5469
  "../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js"(exports) {
5470
5470
  "use strict";
5471
- var stringify2 = (cst) => "type" in cst ? stringifyToken(cst) : stringifyItem(cst);
5471
+ var stringify = (cst) => "type" in cst ? stringifyToken(cst) : stringifyItem(cst);
5472
5472
  function stringifyToken(token) {
5473
5473
  switch (token.type) {
5474
5474
  case "block-scalar": {
@@ -5521,7 +5521,7 @@ var require_cst_stringify = __commonJS({
5521
5521
  res += stringifyToken(value);
5522
5522
  return res;
5523
5523
  }
5524
- exports.stringify = stringify2;
5524
+ exports.stringify = stringify;
5525
5525
  }
5526
5526
  });
5527
5527
 
@@ -7251,7 +7251,7 @@ var require_public_api = __commonJS({
7251
7251
  }
7252
7252
  return doc.toJS(Object.assign({ reviver: _reviver }, options));
7253
7253
  }
7254
- function stringify2(value, replacer, options) {
7254
+ function stringify(value, replacer, options) {
7255
7255
  let _replacer = null;
7256
7256
  if (typeof replacer === "function" || Array.isArray(replacer)) {
7257
7257
  _replacer = replacer;
@@ -7276,7 +7276,7 @@ var require_public_api = __commonJS({
7276
7276
  exports.parse = parse;
7277
7277
  exports.parseAllDocuments = parseAllDocuments;
7278
7278
  exports.parseDocument = parseDocument;
7279
- exports.stringify = stringify2;
7279
+ exports.stringify = stringify;
7280
7280
  }
7281
7281
  });
7282
7282
 
@@ -7555,7 +7555,7 @@ function createErrorResult(error) {
7555
7555
  }
7556
7556
 
7557
7557
  // ../shared/src/agent.ts
7558
- var VALID_AGENT_PROVIDERS = ["claude", "codex", "cursor", "relay"];
7558
+ var VALID_AGENT_PROVIDERS = ["claude", "codex", "cursor", "opencode", "relay"];
7559
7559
  var VALID_CODING_AGENT_PROVIDERS = VALID_AGENT_PROVIDERS.filter(
7560
7560
  (provider) => provider !== "relay"
7561
7561
  );
@@ -7581,10 +7581,15 @@ var AGENT_PROVIDER_OPTIONS = [
7581
7581
  label: "Cursor",
7582
7582
  description: "Use Cursor for tasks"
7583
7583
  },
7584
+ {
7585
+ value: "opencode",
7586
+ label: "Opencode",
7587
+ description: "Use Opencode for tasks"
7588
+ },
7584
7589
  {
7585
7590
  value: "relay",
7586
7591
  label: "Relay",
7587
- description: "Orchestrating agent that delegates to Claude Code, Codex, and Cursor subagents"
7592
+ description: "Orchestrating agent that delegates to Claude Code, Codex, Cursor, and Opencode subagents"
7588
7593
  }
7589
7594
  ];
7590
7595
  var VALID_THINKING_LEVELS = ["low", "medium", "high", "max"];
@@ -7597,6 +7602,8 @@ function getProviderDisplayName(provider, variant = "short") {
7597
7602
  return "Codex";
7598
7603
  case "cursor":
7599
7604
  return "Cursor";
7605
+ case "opencode":
7606
+ return "Opencode";
7600
7607
  case "relay":
7601
7608
  return "Relay";
7602
7609
  case "claude":
@@ -7847,16 +7854,13 @@ scrot /tmp/state.png
7847
7854
  replicas computer info
7848
7855
 
7849
7856
  # 2) Launch a browser on the workspace display.
7850
- replicas computer launch chrome
7857
+ replicas computer launch chrome https://news.ycombinator.com
7851
7858
 
7852
7859
  # 3) Take a screenshot so you can see what's there.
7853
7860
  replicas computer screenshot /tmp/state.png
7854
7861
  # (Read the PNG yourself before deciding where to click.)
7855
7862
 
7856
7863
  # 4) Drive the UI.
7857
- replicas computer key ctrl+l # focus address bar
7858
- replicas computer type "https://news.ycombinator.com"
7859
- replicas computer key Return
7860
7864
  replicas computer click 521 700 # click coordinates from the screenshot
7861
7865
  replicas computer scroll down --amount 5
7862
7866
 
@@ -7909,6 +7913,7 @@ Spawns an app on the workspace display. Built-in aliases:
7909
7913
  - \`notepad\` / \`editor\` - mousepad (lightweight GTK text editor)
7910
7914
  - \`files\` / \`filemanager\` - thunar (file manager)
7911
7915
  Anything else gets \`exec\`'d verbatim, so \`replicas computer launch xeyes\` works if xeyes is installed.
7916
+ When opening a known page, prefer passing the URL directly: \`replicas computer launch chrome http://localhost:3000/\`.
7912
7917
 
7913
7918
  ### \`replicas computer record start <path> [--fps N]\`
7914
7919
  Starts an ffmpeg screen recorder. Output is a fragmented MP4 (still playable if the workspace dies mid-record). Default 60fps; drop to 30 if the workspace is CPU-constrained.
@@ -7934,6 +7939,8 @@ replicas computer screenshot /tmp/after-click.png
7934
7939
 
7935
7940
  ### Typing into an address bar
7936
7941
  \`\`\`bash
7942
+ replicas computer launch chrome
7943
+ sleep 2
7937
7944
  replicas computer key ctrl+l # focus address bar
7938
7945
  replicas computer type "https://example.com"
7939
7946
  replicas computer key Return
@@ -9331,7 +9338,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
9331
9338
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
9332
9339
 
9333
9340
  // ../shared/src/cli-version.ts
9334
- var CLI_VERSION = "0.2.283";
9341
+ var CLI_VERSION = "0.2.284";
9335
9342
 
9336
9343
  // ../shared/src/engine/environment.ts
9337
9344
  var DESKTOP_NOVNC_PORT = 6080;
@@ -9348,6 +9355,7 @@ var DEFAULT_CHAT_TITLES = {
9348
9355
  claude: "Claude Code",
9349
9356
  codex: "Codex",
9350
9357
  cursor: "Cursor",
9358
+ opencode: "Opencode",
9351
9359
  relay: "Relay"
9352
9360
  };
9353
9361
  function getInitialChatId(chats, preferredProvider = "claude") {
@@ -9363,6 +9371,7 @@ var CLAUDE_OPUS_1M_MODEL = "opus[1m]";
9363
9371
  var LEGACY_CLAUDE_OPUS_1M_MODEL = "opus-1m";
9364
9372
  var DEFAULT_CODEX_MODEL = "gpt-5.5";
9365
9373
  var DEFAULT_CURSOR_MODEL = "composer-2";
9374
+ var DEFAULT_OPENCODE_MODEL = "z-ai/glm-5.2";
9366
9375
  function normalizeClaudeModel(model) {
9367
9376
  if (model === LEGACY_CLAUDE_OPUS_1M_MODEL) {
9368
9377
  return CLAUDE_OPUS_1M_MODEL;
@@ -9373,6 +9382,7 @@ var AGENT_MODELS = {
9373
9382
  claude: [CLAUDE_OPUS_1M_MODEL, "sonnet", "haiku"],
9374
9383
  codex: [DEFAULT_CODEX_MODEL, "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex", "gpt-5.2"],
9375
9384
  cursor: [DEFAULT_CURSOR_MODEL, "composer-2.5"],
9385
+ opencode: [DEFAULT_OPENCODE_MODEL, "minimax/minimax-m3", "xiaomi/mimo-v2.5-pro", "moonshotai/kimi-k2.6:free"],
9376
9386
  relay: [CLAUDE_OPUS_1M_MODEL, "sonnet"]
9377
9387
  };
9378
9388
  var MODEL_LABELS = {
@@ -9383,7 +9393,11 @@ var MODEL_LABELS = {
9383
9393
  haiku: "Haiku 4.5",
9384
9394
  [DEFAULT_CODEX_MODEL]: "GPT-5.5",
9385
9395
  [DEFAULT_CURSOR_MODEL]: "Composer 2",
9396
+ [DEFAULT_OPENCODE_MODEL]: "GLM 5.2 via OpenRouter",
9386
9397
  "composer-2.5": "Composer 2.5",
9398
+ "minimax/minimax-m3": "MiniMax M3 via OpenRouter",
9399
+ "xiaomi/mimo-v2.5-pro": "MiMo V2.5 Pro via OpenRouter",
9400
+ "moonshotai/kimi-k2.6:free": "Kimi K2.6 via OpenRouter",
9387
9401
  "gpt-5.4": "GPT-5.4",
9388
9402
  "gpt-5.4-mini": "GPT-5.4 Mini",
9389
9403
  "gpt-5.3-codex": "GPT-5.3 Codex",
@@ -9838,12 +9852,8 @@ function parseCodexEvents(events) {
9838
9852
  return messages;
9839
9853
  }
9840
9854
 
9841
- // ../shared/src/display-message/parsers/cursor-parser.ts
9842
- function getTextContent(value) {
9843
- if (!Array.isArray(value)) return "";
9844
- return value.map((block) => isRecord(block) && block.type === "text" && typeof block.text === "string" ? block.text : "").join("");
9845
- }
9846
- function stringify(value) {
9855
+ // ../shared/src/display-message/parsers/utils.ts
9856
+ function stringifyDisplayValue(value) {
9847
9857
  if (value === void 0 || value === null) return void 0;
9848
9858
  if (typeof value === "string") return value;
9849
9859
  try {
@@ -9852,6 +9862,12 @@ function stringify(value) {
9852
9862
  return String(value);
9853
9863
  }
9854
9864
  }
9865
+
9866
+ // ../shared/src/display-message/parsers/cursor-parser.ts
9867
+ function getTextContent(value) {
9868
+ if (!Array.isArray(value)) return "";
9869
+ return value.map((block) => isRecord(block) && block.type === "text" && typeof block.text === "string" ? block.text : "").join("");
9870
+ }
9855
9871
  function cursorStatusToDisplayStatus(status) {
9856
9872
  return status === "completed" || status === "FINISHED" ? "completed" : status === "error" || status === "ERROR" || status === "CANCELLED" || status === "EXPIRED" ? "failed" : "in_progress";
9857
9873
  }
@@ -9984,7 +10000,7 @@ function parseCursorEvents(events) {
9984
10000
  server: "cursor",
9985
10001
  tool,
9986
10002
  ...input !== void 0 ? { input } : {},
9987
- output: stringify(event.payload.result),
10003
+ output: stringifyDisplayValue(event.payload.result),
9988
10004
  status,
9989
10005
  timestamp: event.timestamp
9990
10006
  };
@@ -10036,6 +10052,130 @@ function parseCursorEvents(events) {
10036
10052
  return messages;
10037
10053
  }
10038
10054
 
10055
+ // ../shared/src/display-message/parsers/opencode-parser.ts
10056
+ function timestampFromMs(value, fallback) {
10057
+ return typeof value === "number" && Number.isFinite(value) ? new Date(value).toISOString() : fallback;
10058
+ }
10059
+ function partFromEvent(event) {
10060
+ return isRecord(event.payload.part) ? event.payload.part : null;
10061
+ }
10062
+ function toolStatus(status) {
10063
+ return status === "completed" ? "completed" : status === "error" ? "failed" : "in_progress";
10064
+ }
10065
+ function setById(messages, id, next) {
10066
+ const index = messages.findIndex((message) => message.id === id);
10067
+ if (index === -1) {
10068
+ messages.push(next);
10069
+ } else {
10070
+ messages[index] = next;
10071
+ }
10072
+ }
10073
+ function assistantError(info) {
10074
+ if (!isRecord(info) || !isRecord(info.error)) return null;
10075
+ const data = isRecord(info.error.data) ? info.error.data : null;
10076
+ if (typeof data?.message === "string") return data.message;
10077
+ if (typeof info.error.message === "string") return info.error.message;
10078
+ return stringifyDisplayValue(info.error) ?? "Opencode run failed";
10079
+ }
10080
+ function parseOpencodeEvents(events) {
10081
+ const messages = [];
10082
+ for (const event of events) {
10083
+ if (event.type === "event_msg" && event.payload.type === "user_message") {
10084
+ const message = event.payload.message;
10085
+ if (typeof message === "string" && message.trim()) {
10086
+ messages.push({
10087
+ id: `opencode-user-${event.timestamp}-${messages.length}`,
10088
+ type: "user",
10089
+ content: message,
10090
+ timestamp: event.timestamp
10091
+ });
10092
+ }
10093
+ continue;
10094
+ }
10095
+ if (event.type === "opencode-message.updated") {
10096
+ const error = assistantError(event.payload.info);
10097
+ if (error) {
10098
+ messages.push({
10099
+ id: `opencode-error-${event.timestamp}-${messages.length}`,
10100
+ type: "error",
10101
+ message: error,
10102
+ timestamp: event.timestamp
10103
+ });
10104
+ }
10105
+ continue;
10106
+ }
10107
+ if (event.type === "opencode-error") {
10108
+ const message = typeof event.payload.message === "string" ? event.payload.message : "Opencode run failed";
10109
+ messages.push({
10110
+ id: `opencode-error-${event.timestamp}-${messages.length}`,
10111
+ type: "error",
10112
+ message,
10113
+ timestamp: event.timestamp
10114
+ });
10115
+ continue;
10116
+ }
10117
+ const part = partFromEvent(event);
10118
+ if (!part) continue;
10119
+ const id = typeof part.id === "string" ? `opencode-${part.id}` : `opencode-${event.timestamp}-${messages.length}`;
10120
+ const time = isRecord(part.time) ? part.time : null;
10121
+ const timestamp = timestampFromMs(time?.start, event.timestamp);
10122
+ if (part.type === "text") {
10123
+ const text = typeof part.text === "string" ? part.text : "";
10124
+ if (text.trim()) {
10125
+ setById(messages, id, {
10126
+ id,
10127
+ type: "agent",
10128
+ content: text,
10129
+ timestamp
10130
+ });
10131
+ }
10132
+ continue;
10133
+ }
10134
+ if (part.type === "reasoning") {
10135
+ const text = typeof part.text === "string" ? part.text : "";
10136
+ if (text.trim()) {
10137
+ setById(messages, id, {
10138
+ id,
10139
+ type: "reasoning",
10140
+ content: text,
10141
+ status: time?.end ? "completed" : "in_progress",
10142
+ timestamp
10143
+ });
10144
+ }
10145
+ continue;
10146
+ }
10147
+ if (part.type === "tool" && isRecord(part.state)) {
10148
+ const state = part.state;
10149
+ const status = toolStatus(state.status);
10150
+ const output = state.status === "completed" ? stringifyDisplayValue(state.output) : state.status === "error" ? stringifyDisplayValue(state.error) : void 0;
10151
+ setById(messages, id, {
10152
+ id,
10153
+ type: "tool_call",
10154
+ server: "opencode",
10155
+ tool: typeof part.tool === "string" ? part.tool : "tool",
10156
+ input: isRecord(state.input) ? state.input : stringifyDisplayValue(state.input),
10157
+ output,
10158
+ status,
10159
+ timestamp
10160
+ });
10161
+ continue;
10162
+ }
10163
+ if (part.type === "patch") {
10164
+ const files = Array.isArray(part.files) ? part.files.filter((file) => typeof file === "string") : [];
10165
+ if (files.length > 0) {
10166
+ setById(messages, id, {
10167
+ id,
10168
+ type: "file_change",
10169
+ changes: files.map((path6) => ({ path: path6, kind: "update" })),
10170
+ status: "completed",
10171
+ timestamp
10172
+ });
10173
+ }
10174
+ }
10175
+ }
10176
+ return messages;
10177
+ }
10178
+
10039
10179
  // ../shared/src/display-message/task-accumulator.ts
10040
10180
  function mapTaskStatus(status) {
10041
10181
  if (status === "in_progress" || status === "completed") return status;
@@ -10745,6 +10885,9 @@ function parseAgentEvents(events, agentType) {
10745
10885
  if (agentType === "cursor") {
10746
10886
  return parseCursorEvents(events);
10747
10887
  }
10888
+ if (agentType === "opencode") {
10889
+ return parseOpencodeEvents(events);
10890
+ }
10748
10891
  return parseClaudeEvents(events);
10749
10892
  }
10750
10893
  function parseDisplayMessages(events, agentType, codexAspTranscript, options = {}) {
@@ -16796,18 +16939,21 @@ function WorkspaceInfo({ status, workspaceName, workspaceId, focused, loading, a
16796
16939
  ...rawEnv,
16797
16940
  claudeAuthMethod: agentAvailability.claude.available ? rawEnv.claudeAuthMethod : "none",
16798
16941
  codexAuthMethod: agentAvailability.codex.available ? rawEnv.codexAuthMethod : "none",
16799
- cursorAuthMethod: agentAvailability.cursor.available ? rawEnv.cursorAuthMethod : "none"
16942
+ cursorAuthMethod: agentAvailability.cursor.available ? rawEnv.cursorAuthMethod : "none",
16943
+ opencodeAuthMethod: agentAvailability.opencode.available ? rawEnv.opencodeAuthMethod : "none"
16800
16944
  } : rawEnv;
16801
16945
  const processingIndicators = [
16802
16946
  { label: "Claude", active: status.isClaudeProcessing },
16803
16947
  { label: "Codex", active: status.isCodexProcessing },
16804
16948
  { label: "Cursor", active: status.isCursorProcessing },
16949
+ { label: "Opencode", active: status.isOpencodeProcessing },
16805
16950
  { label: "Relay", active: status.isRelayProcessing }
16806
16951
  ].filter((indicator) => indicator.active);
16807
16952
  const agentAuthRows = env ? [
16808
16953
  { label: "Claude", authMethod: env.claudeAuthMethod },
16809
16954
  { label: "Codex", authMethod: env.codexAuthMethod },
16810
- { label: "Cursor", authMethod: env.cursorAuthMethod }
16955
+ { label: "Cursor", authMethod: env.cursorAuthMethod },
16956
+ { label: "Opencode", authMethod: env.opencodeAuthMethod }
16811
16957
  ] : [];
16812
16958
  const dashboardItem = findItem("dashboard");
16813
16959
  const wakeItem = findItem("wake");
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  import {
3
3
  AwsRestJsonProtocol
4
- } from "./chunk-NE3F7K7B.mjs";
4
+ } from "./chunk-RQL7JLTE.mjs";
5
5
  import {
6
6
  AwsSdkSigV4Signer,
7
7
  DefaultIdentityProviderConfig,
@@ -13,10 +13,10 @@ import {
13
13
  package_default,
14
14
  resolveAwsSdkSigV4Config,
15
15
  streamCollector
16
- } from "./chunk-WHWH6H5W.mjs";
16
+ } from "./chunk-4FSDNCBY.mjs";
17
17
  import {
18
18
  NodeHttpHandler
19
- } from "./chunk-Q2YIUYO5.mjs";
19
+ } from "./chunk-KK6GYGUU.mjs";
20
20
  import {
21
21
  BinaryDecisionDiagram,
22
22
  Client,
@@ -49,7 +49,7 @@ import {
49
49
  resolveHostHeaderConfig,
50
50
  resolveRetryConfig,
51
51
  resolveUserAgentConfig
52
- } from "./chunk-IYT446IS.mjs";
52
+ } from "./chunk-6VME6DX3.mjs";
53
53
  import {
54
54
  NODE_REGION_CONFIG_FILE_OPTIONS,
55
55
  NODE_REGION_CONFIG_OPTIONS,
@@ -65,7 +65,7 @@ import {
65
65
  resolveDefaultsModeConfig,
66
66
  resolveHttpHandlerRuntimeConfig,
67
67
  resolveRegionConfig
68
- } from "./chunk-VDOMBJEB.mjs";
68
+ } from "./chunk-NVNLENJ4.mjs";
69
69
  import {
70
70
  Hash,
71
71
  calculateBodyLength,
@@ -73,12 +73,12 @@ import {
73
73
  fromUtf8,
74
74
  toBase64,
75
75
  toUtf8
76
- } from "./chunk-BBX2YVOK.mjs";
76
+ } from "./chunk-WQSLVATR.mjs";
77
77
  import {
78
78
  __publicField
79
79
  } from "./chunk-DR4JHUIF.mjs";
80
80
 
81
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/auth/httpAuthSchemeProvider.js
81
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/auth/httpAuthSchemeProvider.js
82
82
  var defaultSSOHttpAuthSchemeParametersProvider = async (config, context, input) => {
83
83
  return {
84
84
  operation: getSmithyContext(context).operation,
@@ -127,7 +127,7 @@ var resolveHttpAuthSchemeConfig = (config) => {
127
127
  });
128
128
  };
129
129
 
130
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/EndpointParameters.js
130
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/EndpointParameters.js
131
131
  var resolveClientEndpointParameters = (options) => {
132
132
  return Object.assign(options, {
133
133
  useDualstackEndpoint: options.useDualstackEndpoint ?? false,
@@ -142,7 +142,7 @@ var commonParams = {
142
142
  UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" }
143
143
  };
144
144
 
145
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/bdd.js
145
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/bdd.js
146
146
  var k = "ref";
147
147
  var a = -1;
148
148
  var b = true;
@@ -229,7 +229,7 @@ var nodes = new Int32Array([
229
229
  ]);
230
230
  var bdd = BinaryDecisionDiagram.from(nodes, root, _data.conditions, _data.results);
231
231
 
232
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/endpointResolver.js
232
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/endpoint/endpointResolver.js
233
233
  var cache = new EndpointCache({
234
234
  size: 50,
235
235
  params: ["Endpoint", "Region", "UseDualStack", "UseFIPS"]
@@ -242,7 +242,7 @@ var defaultEndpointResolver = (endpointParams, context = {}) => {
242
242
  };
243
243
  customEndpointFunctions.aws = awsEndpointFunctions;
244
244
 
245
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/SSOServiceException.js
245
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/SSOServiceException.js
246
246
  var SSOServiceException = class _SSOServiceException extends ServiceException {
247
247
  constructor(options) {
248
248
  super(options);
@@ -250,7 +250,7 @@ var SSOServiceException = class _SSOServiceException extends ServiceException {
250
250
  }
251
251
  };
252
252
 
253
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/errors.js
253
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/models/errors.js
254
254
  var InvalidRequestException = class _InvalidRequestException extends SSOServiceException {
255
255
  constructor(opts) {
256
256
  super({
@@ -300,7 +300,7 @@ var UnauthorizedException = class _UnauthorizedException extends SSOServiceExcep
300
300
  }
301
301
  };
302
302
 
303
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/schemas/schemas_0.js
303
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/schemas/schemas_0.js
304
304
  var _ATT = "AccessTokenType";
305
305
  var _GRC = "GetRoleCredentials";
306
306
  var _GRCR = "GetRoleCredentialsRequest";
@@ -413,7 +413,7 @@ var GetRoleCredentials$ = [
413
413
  () => GetRoleCredentialsResponse$
414
414
  ];
415
415
 
416
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeConfig.shared.js
416
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeConfig.shared.js
417
417
  var getRuntimeConfig = (config) => {
418
418
  return {
419
419
  apiVersion: "2019-06-10",
@@ -450,7 +450,7 @@ var getRuntimeConfig = (config) => {
450
450
  };
451
451
  };
452
452
 
453
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeConfig.js
453
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeConfig.js
454
454
  var getRuntimeConfig2 = (config) => {
455
455
  emitWarningIfUnsupportedVersion2(process.version);
456
456
  const defaultsMode = resolveDefaultsModeConfig(config);
@@ -484,7 +484,7 @@ var getRuntimeConfig2 = (config) => {
484
484
  };
485
485
  };
486
486
 
487
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/auth/httpAuthExtensionConfiguration.js
487
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/auth/httpAuthExtensionConfiguration.js
488
488
  var getHttpAuthExtensionConfiguration = (runtimeConfig) => {
489
489
  const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;
490
490
  let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;
@@ -523,14 +523,14 @@ var resolveHttpAuthRuntimeConfig = (config) => {
523
523
  };
524
524
  };
525
525
 
526
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeExtensions.js
526
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/runtimeExtensions.js
527
527
  var resolveRuntimeExtensions = (runtimeConfig, extensions) => {
528
528
  const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig));
529
529
  extensions.forEach((extension) => extension.configure(extensionConfiguration));
530
530
  return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration));
531
531
  };
532
532
 
533
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/SSOClient.js
533
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/SSOClient.js
534
534
  var SSOClient = class extends Client {
535
535
  constructor(...[configuration]) {
536
536
  const _config_0 = getRuntimeConfig2(configuration || {});
@@ -566,7 +566,7 @@ var SSOClient = class extends Client {
566
566
  }
567
567
  };
568
568
 
569
- // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.17/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/commands/GetRoleCredentialsCommand.js
569
+ // ../node_modules/.bun/@aws-sdk+nested-clients@3.997.22/node_modules/@aws-sdk/nested-clients/dist-es/submodules/sso/commands/GetRoleCredentialsCommand.js
570
570
  var GetRoleCredentialsCommand = class extends Command.classBuilder().ep(commonParams).m(function(Command2, cs, config, o) {
571
571
  return [getEndpointPlugin(config, Command2.getEndpointParameterInstructions())];
572
572
  }).s("SWBPortalService", "GetRoleCredentials", {}).n("SSOClient", "GetRoleCredentialsCommand").sc(GetRoleCredentials$).build() {