@lazehq/cli 0.1.32 → 0.1.34

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 (2) hide show
  1. package/dist/laze.mjs +380 -27
  2. package/package.json +1 -1
package/dist/laze.mjs CHANGED
@@ -35708,7 +35708,7 @@ function flagText({
35708
35708
  }
35709
35709
 
35710
35710
  // src/rules/cli-version.rules.ts
35711
- var STAMPED = "0.1.32";
35711
+ var STAMPED = "0.1.34";
35712
35712
  function cliVersionOf({ stamped = STAMPED } = {}) {
35713
35713
  return stamped.startsWith("__") ? "dev" : stamped;
35714
35714
  }
@@ -59189,6 +59189,18 @@ var saveDraftInputSchemaDefinition = external_exports.object({
59189
59189
  var saveDraftInputSchema = saveDraftInputSchemaDefinition;
59190
59190
  var draftSavedSchemaDefinition = external_exports.object({ saved: external_exports.boolean() });
59191
59191
  var draftSavedSchema = draftSavedSchemaDefinition;
59192
+ var draftsParamsSchemaDefinition = external_exports.object({ workspaceId: workspaceIdSchema });
59193
+ var draftPlaceParamsSchemaDefinition = external_exports.object({
59194
+ workspaceId: workspaceIdSchema,
59195
+ channelId: idSchema4
59196
+ });
59197
+ var draftThreadQuerySchemaDefinition = external_exports.object({ threadRootId: idSchema4.optional() });
59198
+ var draftBodySchemaDefinition = saveDraftInputSchemaDefinition.pick({
59199
+ text: true,
59200
+ picks: true,
59201
+ files: true,
59202
+ savedAt: true
59203
+ });
59192
59204
  var SIDEBAR_SECTIONS_MAX = 50;
59193
59205
  var SIDEBAR_STARRED_MAX = 200;
59194
59206
  var sidebarFilterSchemaDefinition = external_exports.enum(["active", "unreads", "mentions", "all"]);
@@ -60370,12 +60382,27 @@ var liveStepSchemaDefinition = external_exports.object({
60370
60382
  steps: external_exports.number().int().nonnegative().optional()
60371
60383
  });
60372
60384
  var liveStepSchema = liveStepSchemaDefinition;
60385
+ var harnessModelSchemaDefinition = external_exports.object({
60386
+ /** What the harness's `--model` takes, such as `gpt-6-sol` or `opus`. */
60387
+ id: external_exports.string().min(1).max(200),
60388
+ name: external_exports.string().max(200),
60389
+ description: external_exports.string().max(500).default(""),
60390
+ /** The model's own window in tokens, when the harness says it. */
60391
+ contextWindow: external_exports.number().int().positive().nullable().default(null),
60392
+ /** The thinking levels the model takes, lowest first; empty when it takes none. */
60393
+ efforts: external_exports.array(external_exports.string().min(1).max(40)).max(20).default([]),
60394
+ defaultEffort: external_exports.string().max(40).nullable().default(null)
60395
+ });
60396
+ var harnessModelSchema = harnessModelSchemaDefinition;
60373
60397
  var lazeAgentEventSchemaDefinition = external_exports.discriminatedUnion("type", [
60374
60398
  external_exports.object({
60375
60399
  type: external_exports.literal("harness_started"),
60376
60400
  harness: harnessKindSchema,
60377
60401
  resumed: external_exports.boolean(),
60378
- sessionRef: external_exports.string().optional()
60402
+ sessionRef: external_exports.string().optional(),
60403
+ /** The model and thinking effort the session runs on, when the supervisor knows them. */
60404
+ model: external_exports.string().max(200).optional(),
60405
+ effort: external_exports.string().max(40).optional()
60379
60406
  }),
60380
60407
  external_exports.object({
60381
60408
  type: external_exports.literal("turn_started"),
@@ -60463,6 +60490,17 @@ var lazeAgentEventSchemaDefinition = external_exports.discriminatedUnion("type",
60463
60490
  message: external_exports.string(),
60464
60491
  retryable: external_exports.boolean()
60465
60492
  }),
60493
+ /** What the harness lists for its login, read as it starts: its default model first. */
60494
+ external_exports.object({
60495
+ type: external_exports.literal("harness_models"),
60496
+ models: external_exports.array(harnessModelSchemaDefinition).max(100),
60497
+ defaultModel: external_exports.string().max(200).nullable()
60498
+ }),
60499
+ /** The login no longer lists the agent's chosen model: the harness started on its default. */
60500
+ external_exports.object({
60501
+ type: external_exports.literal("model_gone"),
60502
+ model: external_exports.string().min(1).max(200)
60503
+ }),
60466
60504
  external_exports.object({ type: external_exports.literal("idle_stopping"), idleMs: external_exports.number().int().nonnegative() }),
60467
60505
  /** A running turn has said nothing, with no tool running, for `silentMs`. */
60468
60506
  external_exports.object({ type: external_exports.literal("stalled"), silentMs: external_exports.number().int().nonnegative() }),
@@ -60552,6 +60590,8 @@ var agentSandboxSpecSchemaDefinition = external_exports.object({
60552
60590
  harness: harnessKindSchema,
60553
60591
  /** Claude Code or Codex model name. */
60554
60592
  model: external_exports.string().min(1).optional(),
60593
+ /** The thinking effort the harness runs at, such as `high`; absent for the model's default. */
60594
+ effort: external_exports.string().min(1).max(40).optional(),
60555
60595
  /** Claude Code on a Laze model: the gateway through the relay connection, and its models. */
60556
60596
  claudeGateway: external_exports.object({ connectionId: external_exports.string().min(1), models: claudeGatewayModelsSchema }).optional(),
60557
60597
  /** The harness model's context window, when Laze knows it: compaction is set against it. */
@@ -60739,6 +60779,8 @@ var supervisorLaunchSchemaDefinition = external_exports.object({
60739
60779
  marginTokens: external_exports.number().int().nonnegative()
60740
60780
  }),
60741
60781
  model: external_exports.string().optional(),
60782
+ /** The thinking effort the harness runs at; absent for the model's default. */
60783
+ effort: external_exports.string().optional(),
60742
60784
  /** The harness model's context window, when Laze knows it: compaction is set against it. */
60743
60785
  contextWindow: external_exports.number().int().positive().optional(),
60744
60786
  /** Claude Code on a Laze model: the relay as its API, a placeholder as its token. */
@@ -64019,6 +64061,79 @@ var harnessSignInPollSchemaDefinition = external_exports.discriminatedUnion("sta
64019
64061
  ]);
64020
64062
  var harnessSignInPollSchema = harnessSignInPollSchemaDefinition;
64021
64063
 
64064
+ // ../../modules/agent/contract/src/agent-run-config.ts
64065
+ var harnessModelsSchemaDefinition = external_exports.object({
64066
+ models: external_exports.array(harnessModelSchema).max(100),
64067
+ /** The model the harness runs when Laze names none; null when it did not say. */
64068
+ defaultModel: external_exports.string().max(200).nullable(),
64069
+ readAt: external_exports.iso.datetime()
64070
+ });
64071
+ var harnessModelsSchema = harnessModelsSchemaDefinition;
64072
+ var runModelInputSchema = external_exports.string().trim().min(1).max(200).nullable();
64073
+ var runEffortInputSchema = external_exports.string().trim().min(1).max(40).regex(/^[a-z]+$/).nullable();
64074
+ var EFFORT_LABELS = {
64075
+ minimal: "Minimal",
64076
+ low: "Low",
64077
+ medium: "Medium",
64078
+ high: "High",
64079
+ xhigh: "Extra high",
64080
+ max: "Max",
64081
+ ultra: "Ultra"
64082
+ };
64083
+ function effortLabelOf({ effort }) {
64084
+ return EFFORT_LABELS[effort] ?? `${effort.charAt(0).toUpperCase()}${effort.slice(1)}`;
64085
+ }
64086
+ function tokensLabelOf({ tokens }) {
64087
+ if (tokens >= 1e6) return `${Math.round(tokens / 1e5) / 10}M`;
64088
+ return `${Math.round(tokens / 1e3)}k`;
64089
+ }
64090
+ function pickRunningModel({ agent: agent2 }) {
64091
+ if (agent2.harness === "laze-models") return null;
64092
+ const listed = agent2.harnessModels?.models ?? [];
64093
+ const wanted = agent2.model ?? agent2.harnessModels?.defaultModel ?? null;
64094
+ return listed.find((one) => one.id === wanted) ?? (agent2.model ? null : listed[0] ?? null);
64095
+ }
64096
+ function contextCapOf({ agent: agent2 }) {
64097
+ if (agent2.harness === "laze-models") return { tokens: AGENT_CONTEXT_WINDOW.max, known: true };
64098
+ const window2 = pickRunningModel({ agent: agent2 })?.contextWindow ?? null;
64099
+ return window2 ? { tokens: window2, known: true } : { tokens: AGENT_CONTEXT_WINDOW.max, known: false };
64100
+ }
64101
+ var LEVEL_NAMES = { fast: "Laze Fast", frontier: "Laze Frontier" };
64102
+ function modelLineOf({ agent: agent2 }) {
64103
+ if (agent2.harness === "laze-models") return LEVEL_NAMES[agent2.modelLevel ?? "fast"];
64104
+ const running = pickRunningModel({ agent: agent2 });
64105
+ if (agent2.model) return running?.name || agent2.model;
64106
+ return running ? `Default (${running.name || running.id})` : "Default";
64107
+ }
64108
+ function describeEffort({ agent: agent2 }) {
64109
+ const running = pickRunningModel({ agent: agent2 });
64110
+ if (agent2.effort) return effortLabelOf({ effort: agent2.effort });
64111
+ if (running && running.efforts.length === 0) return null;
64112
+ const fallback = running?.defaultEffort;
64113
+ return fallback ? `Default (${effortLabelOf({ effort: fallback })})` : "Default";
64114
+ }
64115
+ function contextLineOf({ agent: agent2 }) {
64116
+ const cap = contextCapOf({ agent: agent2 });
64117
+ if (agent2.harness === "laze-models") {
64118
+ const tokens = agent2.contextWindow ?? AGENT_CONTEXT_WINDOW.default;
64119
+ return `${tokensLabelOf({ tokens })}, up to ${tokensLabelOf({ tokens: cap.tokens })}`;
64120
+ }
64121
+ if (!cap.known) {
64122
+ return agent2.contextWindow ? `${tokensLabelOf({ tokens: agent2.contextWindow })}, or the model's window if smaller` : "The model's own window";
64123
+ }
64124
+ const set2 = agent2.contextWindow ? Math.min(agent2.contextWindow, cap.tokens) : null;
64125
+ if (!set2 || set2 === cap.tokens)
64126
+ return `${tokensLabelOf({ tokens: cap.tokens })}, the most this model takes`;
64127
+ return `${tokensLabelOf({ tokens: set2 })} of the ${tokensLabelOf({ tokens: cap.tokens })} this model takes`;
64128
+ }
64129
+ function agentRunSummaryOf({ agent: agent2 }) {
64130
+ return {
64131
+ model: modelLineOf({ agent: agent2 }),
64132
+ effort: describeEffort({ agent: agent2 }),
64133
+ context: contextLineOf({ agent: agent2 })
64134
+ };
64135
+ }
64136
+
64022
64137
  // ../../modules/agent/contract/src/agent-manage.ts
64023
64138
  var hostedHarnessSchema = external_exports.enum(["laze-models", "claude-code", "codex"]);
64024
64139
  var nameSchema = external_exports.string().trim().min(1).max(80);
@@ -64048,8 +64163,12 @@ var updateAgentAsCallerInputSchemaDefinition = external_exports.object({
64048
64163
  name: nameSchema.optional(),
64049
64164
  description: descriptionSchema.optional(),
64050
64165
  avatar: agentAvatarInputSchema.optional(),
64051
- /** The context window of an agent Laze runs, in tokens, 100k to 1M. */
64052
- contextWindow: contextWindowInputSchema.optional(),
64166
+ /** The max context of an agent Laze runs, in tokens, 100k to 1M; null for its default. */
64167
+ contextWindow: contextWindowInputSchema.nullable().optional(),
64168
+ /** The model its login lists, or null for the harness's default. */
64169
+ model: runModelInputSchema.optional(),
64170
+ /** The thinking level its model lists, or null for the model's default. */
64171
+ effort: runEffortInputSchema.optional(),
64053
64172
  /** Pauses or resumes an agent Laze runs. */
64054
64173
  paused: external_exports.boolean().optional(),
64055
64174
  pauseReason: external_exports.string().trim().max(200).optional()
@@ -64278,8 +64397,14 @@ var agentSchemaDefinition = external_exports.object({
64278
64397
  /** A Laze agent's SOUL.md. */
64279
64398
  instructions: external_exports.string().default(""),
64280
64399
  modelLevel: agentModelLevelSchema.nullable().default(null),
64281
- /** The context window of an agent Laze runs, in tokens; null on a connected agent. */
64400
+ /** The max context of an agent Laze runs, in tokens; null for its default or a connected one. */
64282
64401
  contextWindow: external_exports.number().int().positive().nullable().default(null),
64402
+ /** The model a Claude Code or Codex agent runs; null for its harness's default. */
64403
+ model: external_exports.string().nullable().default(null),
64404
+ /** The thinking effort it runs at; null for its model's default. */
64405
+ effort: external_exports.string().nullable().default(null),
64406
+ /** The models its harness listed for its login when it last started; null before then. */
64407
+ harnessModels: harnessModelsSchema.nullable().default(null),
64283
64408
  /** The GitHub identity a Laze agent works as; null when it has none. */
64284
64409
  github: agentGithubSchema.nullable().default(null),
64285
64410
  /** Out of usage (its login or its Laze models budget) until this time; null when it can work. */
@@ -64336,8 +64461,12 @@ var updateAgentInputSchemaDefinition = external_exports.object({
64336
64461
  name: agentNameSchema.optional(),
64337
64462
  avatar: agentAvatarInputSchema.optional(),
64338
64463
  modelLevel: agentModelLevelSchema.optional(),
64339
- /** Agents Laze runs only; a connected agent refuses it. */
64340
- contextWindow: contextWindowInputSchema.optional(),
64464
+ /** Agents Laze runs only; a connected agent refuses it. Null puts back the default. */
64465
+ contextWindow: contextWindowInputSchema.nullable().optional(),
64466
+ /** A model its login lists, or null for the harness's default; Claude Code and Codex only. */
64467
+ model: runModelInputSchema.optional(),
64468
+ /** A thinking level its model lists, or null for the model's default. */
64469
+ effort: runEffortInputSchema.optional(),
64341
64470
  instructions: instructionsSchema.optional(),
64342
64471
  /** The whole set: channels left out are left. */
64343
64472
  channelIds: external_exports.array(idSchema14).max(50).optional(),
@@ -64718,8 +64847,6 @@ var agentConfig = Config.define((c) => ({
64718
64847
  "AGENT_CLAUDE_GATEWAY_THINKING",
64719
64848
  external_exports.enum(["on", "off"]).default("on")
64720
64849
  ),
64721
- /** The Codex model's window, which caps a Codex agent's context window setting. */
64722
- codexContextWindow: c.env("AGENT_CODEX_CONTEXT", positiveInt3.default(4e5)),
64723
64850
  /** A harness prompt or question no one answers is denied or dismissed after this long. */
64724
64851
  attentionTimeoutMinutes: c.env("AGENT_ATTENTION_TIMEOUT_MINUTES", positiveInt3.default(30)),
64725
64852
  /** Where a GitHub signature links back; the origin the connect command fetches the CLI from. */
@@ -65357,6 +65484,11 @@ var requestConnectionInputSchemaDefinition = external_exports.object({
65357
65484
  name: external_exports.string().trim().max(80).optional()
65358
65485
  });
65359
65486
 
65487
+ // ../../modules/agent/contract/src/agent-profile.ui.ts
65488
+ var agentProfileUi = uiTokens("agent");
65489
+ var AgentProfileSlot = agentProfileUi.component("profile");
65490
+ var AgentOwnedListSlot = agentProfileUi.component("ownedList");
65491
+
65360
65492
  // src/services/laze-client.service.ts
65361
65493
  var CLI_VERSION_HEADER = "x-laze-cli-version";
65362
65494
  var LazeApiError = class extends Error {
@@ -65727,6 +65859,7 @@ function agentProfileOf({
65727
65859
  baseUrl
65728
65860
  }) {
65729
65861
  const owner = ownerName || "its owner";
65862
+ const run4 = agent2.hosting === "laze" ? agentRunSummaryOf({ agent: agent2 }) : null;
65730
65863
  return {
65731
65864
  id: agent2.id,
65732
65865
  name: agent2.name,
@@ -65735,6 +65868,9 @@ function agentProfileOf({
65735
65868
  intelligence: intelligenceOf({ agent: agent2, owner }),
65736
65869
  status: statusOf({ agent: agent2 }),
65737
65870
  login: loginOf({ agent: agent2 }),
65871
+ model: run4?.model ?? null,
65872
+ effort: run4?.effort ?? null,
65873
+ maxContext: run4?.context ?? null,
65738
65874
  createdAt: agent2.createdAt.slice(0, 10),
65739
65875
  channels: agent2.channels.filter((channel) => channel.kind === "public" || channel.kind === "private").map((channel) => `#${channel.name}`),
65740
65876
  link: `${baseUrl.replace(/\/$/, "")}/workspaces/${agent2.workspaceId}/agents`
@@ -65747,6 +65883,9 @@ function formatAgentProfile({ profile }) {
65747
65883
  ["Intelligence", profile.intelligence],
65748
65884
  ["Status", profile.status],
65749
65885
  ["Login", profile.login],
65886
+ ["Model", profile.model],
65887
+ ["Thinking effort", profile.effort],
65888
+ ["Max context", profile.maxContext],
65750
65889
  ["Created", profile.createdAt],
65751
65890
  ["Channels", profile.channels.length > 0 ? profile.channels.join(", ") : "none"],
65752
65891
  ["Profile", profile.link]
@@ -66015,7 +66154,7 @@ var slackBookmarksSchema = slackBookmarksSchemaDefinition;
66015
66154
  // ../../modules/slack/contract/src/slack-direct.ts
66016
66155
  var slackPeopleInputSchemaDefinition = external_exports.object({
66017
66156
  workspaceId: external_exports.string().min(1),
66018
- /** Part of a name; empty lists the first people. */
66157
+ /** Part of a Slack name, full name or email; empty lists the first people. */
66019
66158
  query: external_exports.string().trim().max(80).default("")
66020
66159
  });
66021
66160
  var slackPeopleInputSchema = slackPeopleInputSchemaDefinition;
@@ -66024,6 +66163,10 @@ var slackPersonSchemaDefinition = external_exports.object({
66024
66163
  teamName: external_exports.string(),
66025
66164
  slackUserId: external_exports.string(),
66026
66165
  name: external_exports.string(),
66166
+ /** Their full name in Slack, empty when it is the same as `name` or Slack gave none. */
66167
+ realName: external_exports.string().default(""),
66168
+ /** Their Slack profile email; null when Slack does not share it. */
66169
+ email: external_exports.string().nullable().default(null),
66027
66170
  avatarUrl: external_exports.string().nullable()
66028
66171
  });
66029
66172
  var slackPeopleSchemaDefinition = external_exports.object({ people: external_exports.array(slackPersonSchemaDefinition) });
@@ -66874,6 +67017,17 @@ function rushStandingOf({ one }) {
66874
67017
  if (!one || one.state === "stopped") return "stopped";
66875
67018
  return one.alive === false ? "asleep" : "awake";
66876
67019
  }
67020
+ var LAUNCH_NAMES = ["IS_SANDBOX", "CLAUDE_CONFIG_DIR", "HOME", "PATH"];
67021
+ function launchEnvOf({
67022
+ inherited
67023
+ }) {
67024
+ const picked = {};
67025
+ for (const name2 of LAUNCH_NAMES) {
67026
+ const value = inherited[name2];
67027
+ if (value !== void 0) picked[name2] = value;
67028
+ }
67029
+ return picked;
67030
+ }
66877
67031
 
66878
67032
  // src/services/claude-project.service.ts
66879
67033
  import { basename as basename2, isAbsolute, relative as relative2, resolve as resolve2 } from "node:path";
@@ -67024,7 +67178,8 @@ async function rememberSession({
67024
67178
  if (!session || !claudePid) return;
67025
67179
  const path = statePathOf({ context, kind: "sessions", profile: String(claudePid) });
67026
67180
  await mkdir3(dirname3(path), { recursive: true, mode: 448 });
67027
- await writeFile3(path, JSON.stringify(session), { mode: 384 });
67181
+ const launch = launchEnvOf({ inherited: context.environment.inherited });
67182
+ await writeFile3(path, JSON.stringify({ ...session, launch }), { mode: 384 });
67028
67183
  }
67029
67184
  async function currentSessionOf({
67030
67185
  context,
@@ -69819,6 +69974,9 @@ are waiting, if you think one was missed.
69819
69974
  - \`laze history <channel>\` and \`laze thread <id>\` read a conversation.
69820
69975
  - \`laze search "words"\` searches messages.
69821
69976
  - \`laze channels list\` lists the conversations you are in.
69977
+ - \`laze channel info <channel>\` shows its members and the apps pinned there. Read a pinned app
69978
+ with \`laze app pull --app <app>\` (its files: page, plan, code) and
69979
+ \`laze app records list <collection> --app <app>\` (its data).
69822
69980
 
69823
69981
  If \`laze\` is not on the PATH, run the same commands through \`npx -y @lazehq/cli@latest\`.
69824
69982
  Never print or repeat your Laze key.
@@ -70640,7 +70798,7 @@ function formatLoginActivity({ activity: activity2 }) {
70640
70798
 
70641
70799
  // src/services/agent-manage-commands.service.ts
70642
70800
  var CREATE_USAGE = "Usage: laze agent create --name <name> [--description <text>] [--harness laze-models|claude-code|codex] [--team] [--pool <pool>] [--avatar <file>]";
70643
- var UPDATE_USAGE = "Usage: laze agent update <agent> [--name <name>] [--description <text>] [--avatar <file>] [--context-window <tokens, such as 400k or 1M>]";
70801
+ var UPDATE_USAGE = "Usage: laze agent update <agent> [--name <name>] [--description <text>] [--avatar <file>] [--model <model>|default] [--effort <level>|default] [--max-context <tokens, such as 200k>|default]";
70644
70802
  var ARCHIVE_USAGE = "Usage: laze agent archive <agent>";
70645
70803
  var PAUSE_USAGE = 'Usage: laze agent pause <agent> [--reason "<why>"] | laze agent resume <agent>';
70646
70804
  var TRANSFER_USAGE = "Usage: laze agent transfer <agent> <member: user id, email or name>";
@@ -70673,13 +70831,40 @@ async function avatarOf({
70673
70831
  return uploaded.avatar;
70674
70832
  }
70675
70833
  function contextWindowOf2({ args }) {
70676
- const value = args.flags["context-window"];
70834
+ const value = args.flags["max-context"] ?? args.flags["context-window"];
70677
70835
  if (value === void 0) return void 0;
70836
+ if (value === "default") return null;
70678
70837
  const match = typeof value === "string" ? /^(\d+(?:\.\d+)?)([kKmM]?)$/.exec(value.trim()) : null;
70679
70838
  if (!match) throw new CliUsageError(UPDATE_USAGE);
70680
70839
  const unit = { k: 1e3, m: 1e6 }[match[2]?.toLowerCase() ?? ""] ?? 1;
70681
70840
  return Math.round(Number(match[1]) * unit);
70682
70841
  }
70842
+ function runFlagOf({ args, name: name2 }) {
70843
+ const value = args.flags[name2];
70844
+ if (value === void 0) return void 0;
70845
+ if (typeof value !== "string" || !value.trim()) throw new CliUsageError(UPDATE_USAGE);
70846
+ return value.trim() === "default" ? null : value.trim();
70847
+ }
70848
+ function runChangesOf({ args }) {
70849
+ const contextWindow = contextWindowOf2({ args });
70850
+ const model = runFlagOf({ args, name: "model" });
70851
+ const effort = runFlagOf({ args, name: "effort" });
70852
+ return {
70853
+ ...contextWindow !== void 0 && { contextWindow },
70854
+ ...model !== void 0 && { model },
70855
+ ...effort !== void 0 && { effort }
70856
+ };
70857
+ }
70858
+ function runLinesOf({ agent: agent2 }) {
70859
+ if (agent2.hosting !== "laze") return [];
70860
+ const summary = agentRunSummaryOf({ agent: agent2 });
70861
+ return [
70862
+ `Model: ${summary.model}.`,
70863
+ ...summary.effort ? [`Thinking effort: ${summary.effort}.`] : [],
70864
+ `Max context: ${summary.context}.`,
70865
+ "It takes effect on its next turn."
70866
+ ];
70867
+ }
70683
70868
  function descriptionOf({ args }) {
70684
70869
  const value = args.flags.description;
70685
70870
  return typeof value === "string" ? value : void 0;
@@ -70761,9 +70946,9 @@ async function updateAgent({
70761
70946
  const agent2 = args.words[2];
70762
70947
  const name2 = flagText({ args, name: "name" }).trim();
70763
70948
  const description = descriptionOf({ args });
70764
- const contextWindow = contextWindowOf2({ args });
70949
+ const run4 = runChangesOf({ args });
70765
70950
  const nothing = !name2 && description === void 0 && !args.flags.avatar;
70766
- if (!agent2 || nothing && contextWindow === void 0) throw new CliUsageError(UPDATE_USAGE);
70951
+ if (!agent2 || nothing && Object.keys(run4).length === 0) throw new CliUsageError(UPDATE_USAGE);
70767
70952
  const { client } = await signedIn({ context, args });
70768
70953
  const avatar = await avatarOf({ context, args, client });
70769
70954
  const updated = await client.post("/api/agents/update", {
@@ -70771,14 +70956,14 @@ async function updateAgent({
70771
70956
  ...name2 && { name: name2 },
70772
70957
  ...description !== void 0 && { description },
70773
70958
  ...avatar !== void 0 && { avatar },
70774
- ...contextWindow !== void 0 && { contextWindow }
70959
+ ...run4
70775
70960
  });
70776
70961
  if (args.flags.json) return context.out(`${JSON.stringify(updated, null, 2)}
70777
70962
  `);
70778
70963
  context.out(
70779
70964
  [
70780
70965
  `Updated ${updated.name}.`,
70781
- ...updated.contextWindow ? [`Its context window is ${updated.contextWindow.toLocaleString("en-GB")} tokens.`] : [],
70966
+ ...runLinesOf({ agent: updated }),
70782
70967
  ...mentionLinesOf({ agentId: updated.id, name: updated.name }),
70783
70968
  ""
70784
70969
  ].join("\n")
@@ -71771,6 +71956,13 @@ var appPreviewSchemaDefinition = external_exports.object({
71771
71956
  /** The site's own origin; opening it signs the person in through Laze. */
71772
71957
  url: external_exports.string()
71773
71958
  });
71959
+ var appPullSchemaDefinition = external_exports.object({
71960
+ app: external_exports.object({ id: external_exports.string(), name: external_exports.string(), slug: external_exports.string() }),
71961
+ site: appSiteSchema,
71962
+ version: appVersionIdSchema,
71963
+ files: external_exports.array(appFileSchema),
71964
+ collections: external_exports.array(collectionSchema)
71965
+ });
71774
71966
  var exportRecordsInputSchemaDefinition = external_exports.object({
71775
71967
  ...siteRefSchemaDefinition.shape,
71776
71968
  collection: collectionNameSchema,
@@ -72019,6 +72211,27 @@ var appAccessRequestSchemaDefinition = external_exports.object({
72019
72211
  decidedAt: external_exports.iso.datetime().nullable()
72020
72212
  });
72021
72213
  var appAccessRequestSchema = appAccessRequestSchemaDefinition;
72214
+ var appMemberSourceSchemaDefinition = external_exports.object({
72215
+ kind: external_exports.enum(["owner", "admin", "direct", "channel", "workspace", "agent-owner"]),
72216
+ /** The channel, for `channel`: a pin there, a share with it, or the app's own channel. */
72217
+ channelId: external_exports.string().nullable(),
72218
+ channelName: external_exports.string().nullable(),
72219
+ /** The person an agent holds the app through, for `agent-owner`. */
72220
+ ownerName: external_exports.string().nullable()
72221
+ });
72222
+ var appMemberSchemaDefinition = external_exports.object({
72223
+ member: external_exports.object({ type: external_exports.enum(["user", "agent"]), id: external_exports.string().min(1) }),
72224
+ name: external_exports.string(),
72225
+ role: appRoleSchema,
72226
+ sources: external_exports.array(appMemberSourceSchemaDefinition).min(1),
72227
+ /** Whether a Builder can take this access away here: only a direct share is removable. */
72228
+ removable: external_exports.boolean()
72229
+ });
72230
+ var appMembersSchemaDefinition = external_exports.object({
72231
+ appId: external_exports.string().min(1),
72232
+ members: external_exports.array(appMemberSchemaDefinition)
72233
+ });
72234
+ var appMembersSchema = appMembersSchemaDefinition;
72022
72235
  var appAccessSchemaDefinition = external_exports.object({
72023
72236
  appId: external_exports.string().min(1),
72024
72237
  visibility: appVisibilitySchema,
@@ -72498,7 +72711,7 @@ var appBackupCheckAlertsSchemaDefinition = external_exports.object({
72498
72711
  });
72499
72712
 
72500
72713
  // ../../modules/app/contract/src/app.trpc.ts
72501
- var appMainTrpc = defineTrpcContract("app").query("list").withInput(listAppsInputSchema).withOutput(external_exports.array(appSchema)).query("get").withInput(appRefSchema).withOutput(appSchema).mutation("create").withInput(createAppInputSchema).withOutput(appSchema).mutation("rename").withInput(renameAppInputSchema).withOutput(appSchema).mutation("archive").withInput(appRefSchema).withOutput(appSchema).mutation("unarchive").withInput(appRefSchema).withOutput(appSchema).mutation("delete").withInput(deleteAppInputSchema).withOutput(external_exports.object({ deleted: external_exports.literal(true) })).query("versions").withInput(appRefSchema).withOutput(external_exports.array(appVersionSchema)).mutation("revert").withInput(revertInputSchema).withOutput(appVersionSchema).mutation("publish").withInput(publishInputSchema).withOutput(publishOutcomeSchema).query("collections").withInput(siteRefSchema).withOutput(external_exports.array(collectionSchema)).query("records").withInput(listRecordsInputSchema).withOutput(recordPageSchema).mutation("writeRecord").withInput(writeRecordInputSchema).withOutput(appRecordSchema).mutation("deleteRecord").withInput(deleteRecordInputSchema).withOutput(external_exports.object({ deleted: external_exports.literal(true) })).query("views").withInput(siteRefSchema).withOutput(external_exports.array(appViewSchema)).mutation("saveView").withInput(saveViewInputSchema).withOutput(appViewSchema).mutation("deleteView").withInput(deleteViewInputSchema).withOutput(external_exports.object({ deleted: external_exports.literal(true) })).mutation("chooseCardRows").withInput(chooseCardRowsInputSchema).withOutput(appCardChoiceSchema).query("exportRecords").withInput(exportRecordsInputSchema).withOutput(recordExportSchema).mutation("importRecords").withInput(importRecordsInputSchema).withOutput(recordImportSchema).mutation("decidePublish").withInput(decidePublishInputSchema).withOutput(publishOutcomeSchema).mutation("nameVersion").withInput(nameVersionInputSchema).withOutput(appVersionSchema).mutation("makeInternal").withInput(appRefSchema).withOutput(appSchema).mutation("revokePublishLease").withInput(appRefSchema).withOutput(appSchema).mutation("signInHandoff").withInput(signInHandoffInputSchema).withOutput(signInHandoffSchema).query("functionLogs").withInput(listFunctionLogsInputSchema).withOutput(external_exports.array(appFunctionLogEntrySchema)).query("functionSettings").withInput(appWorkspaceRefSchema).withOutput(appFunctionSettingsSchema).query("access").withInput(appRefSchema).withOutput(appAccessSchema).mutation("grantAccess").withInput(grantAppAccessInputSchema).withOutput(appAccessSchema).mutation("revokeAccess").withInput(revokeAppAccessInputSchema).withOutput(appAccessSchema).mutation("setVisibility").withInput(setAppVisibilityInputSchema).withOutput(visibilityOutcomeSchema).mutation("setMemberRole").withInput(setMemberRoleInputSchema).withOutput(appAccessSchema).mutation("unpublish").withInput(appRefSchema).withOutput(appSchema).query("door").withInput(appRefSchema).withOutput(appDoorSchema).mutation("requestAccess").withInput(appRefSchema).withOutput(appDoorSchema).mutation("decideAccess").withInput(decideAppAccessInputSchema).withOutput(appAccessRequestSchema).query("users").withInput(appRefSchema).withOutput(appUsersSchema).mutation("blockUser").withInput(blockAppUserInputSchema).withOutput(appUsersSchema).mutation("deleteUser").withInput(deleteAppUserInputSchema).withOutput(deletedAppUserSchema).mutation("setFunctionsEnabled").withInput(setFunctionsEnabledInputSchema).withOutput(appFunctionSettingsSchema).query("backups").withInput(appRefSchema).withOutput(appBackupStatusSchema).mutation("restoreData").withInput(restoreAppDataInputSchema).withOutput(appRestoreSchema).query("cost").withInput(appRefSchema).withOutput(appCostSchema).mutation("setBudget").withInput(setAppBudgetInputSchema).withOutput(appCostSchema).query("triggers").withInput(appRefSchema).withOutput(appTriggersSchema).mutation("setTriggerPaused").withInput(setAppTriggerPausedInputSchema).withOutput(appTriggerSchema).mutation("removeTrigger").withInput(appTriggerRefSchema).withOutput(external_exports.object({ removed: external_exports.literal(true) })).build();
72714
+ var appMainTrpc = defineTrpcContract("app").query("list").withInput(listAppsInputSchema).withOutput(external_exports.array(appSchema)).query("get").withInput(appRefSchema).withOutput(appSchema).mutation("create").withInput(createAppInputSchema).withOutput(appSchema).mutation("rename").withInput(renameAppInputSchema).withOutput(appSchema).mutation("archive").withInput(appRefSchema).withOutput(appSchema).mutation("unarchive").withInput(appRefSchema).withOutput(appSchema).mutation("delete").withInput(deleteAppInputSchema).withOutput(external_exports.object({ deleted: external_exports.literal(true) })).query("versions").withInput(appRefSchema).withOutput(external_exports.array(appVersionSchema)).mutation("revert").withInput(revertInputSchema).withOutput(appVersionSchema).mutation("publish").withInput(publishInputSchema).withOutput(publishOutcomeSchema).query("collections").withInput(siteRefSchema).withOutput(external_exports.array(collectionSchema)).query("records").withInput(listRecordsInputSchema).withOutput(recordPageSchema).mutation("writeRecord").withInput(writeRecordInputSchema).withOutput(appRecordSchema).mutation("deleteRecord").withInput(deleteRecordInputSchema).withOutput(external_exports.object({ deleted: external_exports.literal(true) })).query("views").withInput(siteRefSchema).withOutput(external_exports.array(appViewSchema)).mutation("saveView").withInput(saveViewInputSchema).withOutput(appViewSchema).mutation("deleteView").withInput(deleteViewInputSchema).withOutput(external_exports.object({ deleted: external_exports.literal(true) })).mutation("chooseCardRows").withInput(chooseCardRowsInputSchema).withOutput(appCardChoiceSchema).query("exportRecords").withInput(exportRecordsInputSchema).withOutput(recordExportSchema).mutation("importRecords").withInput(importRecordsInputSchema).withOutput(recordImportSchema).mutation("decidePublish").withInput(decidePublishInputSchema).withOutput(publishOutcomeSchema).mutation("nameVersion").withInput(nameVersionInputSchema).withOutput(appVersionSchema).mutation("makeInternal").withInput(appRefSchema).withOutput(appSchema).mutation("revokePublishLease").withInput(appRefSchema).withOutput(appSchema).mutation("signInHandoff").withInput(signInHandoffInputSchema).withOutput(signInHandoffSchema).query("functionLogs").withInput(listFunctionLogsInputSchema).withOutput(external_exports.array(appFunctionLogEntrySchema)).query("functionSettings").withInput(appWorkspaceRefSchema).withOutput(appFunctionSettingsSchema).query("access").withInput(appRefSchema).withOutput(appAccessSchema).query("members").withInput(appRefSchema).withOutput(appMembersSchema).mutation("grantAccess").withInput(grantAppAccessInputSchema).withOutput(appAccessSchema).mutation("revokeAccess").withInput(revokeAppAccessInputSchema).withOutput(appAccessSchema).mutation("setVisibility").withInput(setAppVisibilityInputSchema).withOutput(visibilityOutcomeSchema).mutation("setMemberRole").withInput(setMemberRoleInputSchema).withOutput(appAccessSchema).mutation("unpublish").withInput(appRefSchema).withOutput(appSchema).query("door").withInput(appRefSchema).withOutput(appDoorSchema).mutation("requestAccess").withInput(appRefSchema).withOutput(appDoorSchema).mutation("decideAccess").withInput(decideAppAccessInputSchema).withOutput(appAccessRequestSchema).query("users").withInput(appRefSchema).withOutput(appUsersSchema).mutation("blockUser").withInput(blockAppUserInputSchema).withOutput(appUsersSchema).mutation("deleteUser").withInput(deleteAppUserInputSchema).withOutput(deletedAppUserSchema).mutation("setFunctionsEnabled").withInput(setFunctionsEnabledInputSchema).withOutput(appFunctionSettingsSchema).query("backups").withInput(appRefSchema).withOutput(appBackupStatusSchema).mutation("restoreData").withInput(restoreAppDataInputSchema).withOutput(appRestoreSchema).query("cost").withInput(appRefSchema).withOutput(appCostSchema).mutation("setBudget").withInput(setAppBudgetInputSchema).withOutput(appCostSchema).query("triggers").withInput(appRefSchema).withOutput(appTriggersSchema).mutation("setTriggerPaused").withInput(setAppTriggerPausedInputSchema).withOutput(appTriggerSchema).mutation("removeTrigger").withInput(appTriggerRefSchema).withOutput(external_exports.object({ removed: external_exports.literal(true) })).build();
72502
72715
  var appConnectionsTrpc = defineTrpcContract("app").query("connections").withInput(appRefSchema).withOutput(appConnectionsSchema).mutation("allowConnection").withInput(appConnectionRefSchema).withOutput(appConnectionsSchema).mutation("revokeConnection").withInput(appConnectionRefSchema).withOutput(appConnectionsSchema).build();
72503
72716
  var appPinsTrpc = defineTrpcContract("app").query("pins").withInput(channelPinsInputSchema).withOutput(channelAppPinsSchema).mutation("pin").withInput(pinAppInputSchema).withOutput(channelAppPinsSchema).mutation("unpin").withInput(pinAppInputSchema).withOutput(channelAppPinsSchema).mutation("setPinView").withInput(setPinViewInputSchema).withOutput(channelAppPinsSchema).mutation("reorderPins").withInput(reorderPinsInputSchema).withOutput(channelAppPinsSchema).build();
72504
72717
  var appTrpc = joinTrpcContracts("app", appMainTrpc, appConnectionsTrpc, appPinsTrpc);
@@ -72612,6 +72825,12 @@ var appCliCommands = [
72612
72825
  arguments: ["--site draft|published"],
72613
72826
  summary: "Print the address of the draft preview (or the published app)"
72614
72827
  },
72828
+ {
72829
+ command: "laze app pull",
72830
+ operation: "pullFiles",
72831
+ arguments: ["[dir]", "--site published|draft"],
72832
+ summary: "Download the app's files and a laze.app.json into a folder (default ./<slug>), to read its page, plan or code; anyone who may open the app can pull it"
72833
+ },
72615
72834
  {
72616
72835
  command: "laze app publish",
72617
72836
  operation: "requestPublish",
@@ -72630,6 +72849,12 @@ var appCliCommands = [
72630
72849
  arguments: [],
72631
72850
  summary: "Take the published address offline at once; the data stays"
72632
72851
  },
72852
+ {
72853
+ command: "laze app members",
72854
+ operation: "listMembers",
72855
+ arguments: ["[app]"],
72856
+ summary: "Everyone who can open the app, people and agents, each with how: Owner, Shared directly, via #channel or the workspace"
72857
+ },
72633
72858
  {
72634
72859
  command: "laze app access",
72635
72860
  operation: "getAccess",
@@ -73710,6 +73935,16 @@ function print3({
73710
73935
  context.out(args.flags.json ? `${JSON.stringify(value, null, 2)}
73711
73936
  ` : text2);
73712
73937
  }
73938
+ function readLineOf(pin) {
73939
+ if (pin.kind === "browser") return ` read it: laze browser read ${pin.appId}
73940
+ `;
73941
+ if (pin.role === null) {
73942
+ return ` you cannot open it: ask ${pin.pinnedByName ?? "whoever pinned it"} to give you access
73943
+ `;
73944
+ }
73945
+ return ` read it: laze app pull --app ${pin.appId} (its files), laze app records list <collection> --app ${pin.appId} (its data)
73946
+ `;
73947
+ }
73713
73948
  function pinsText({ channel, listed }) {
73714
73949
  if (listed.pins.length === 0) {
73715
73950
  return `No apps are pinned to ${channel}. laze app pin --channel ${channel} pins one.
@@ -73717,7 +73952,7 @@ function pinsText({ channel, listed }) {
73717
73952
  }
73718
73953
  const lines = listed.pins.map(
73719
73954
  (pin) => `${pin.name} ${pin.appId} pinned by ${pin.pinnedByName ?? pin.pinnedBy.id} ${pin.pinnedAt.slice(0, 10)}
73720
- `
73955
+ ` + readLineOf(pin)
73721
73956
  );
73722
73957
  return `Pinned to ${channel}:
73723
73958
  ${lines.join("")}`;
@@ -74199,6 +74434,80 @@ var appPreview = async ({ context, args }) => {
74199
74434
  print5({ context, args, value: preview, text: `${preview.url}
74200
74435
  ` });
74201
74436
  };
74437
+ async function folderClaim({
74438
+ folder,
74439
+ appId
74440
+ }) {
74441
+ const entries = await readdir6(folder).catch(() => []);
74442
+ if (entries.length === 0) return "empty";
74443
+ const manifest = await readManifest(folder).catch(() => void 0);
74444
+ if (!manifest) return "other-files";
74445
+ return manifest.app.id === appId ? "same" : "other-app";
74446
+ }
74447
+ var appPull = async ({ context, args }) => {
74448
+ const client = await appClient({ context, args });
74449
+ const word3 = args.words[2];
74450
+ const appId = await appIdOf({ client, args, folder: folderOf({ context, word: word3 }) });
74451
+ const site = siteOf(args, "published");
74452
+ let pulled;
74453
+ try {
74454
+ pulled = await client.post("/api/apps/pull", { appId, site });
74455
+ } catch (error62) {
74456
+ if (error62 instanceof LazeApiError && error62.code === "app_has_no_version") {
74457
+ throw new CliUsageError(
74458
+ "Nothing is published yet; `laze app pull --site draft` pulls the draft preview (app_has_no_version)"
74459
+ );
74460
+ }
74461
+ throw error62;
74462
+ }
74463
+ const folder = folderOf({
74464
+ context,
74465
+ word: word3 ?? (flagText({ args, name: "app" }) ? pulled.app.slug : void 0)
74466
+ });
74467
+ const claim3 = await folderClaim({ folder, appId: pulled.app.id });
74468
+ if (claim3 === "other-app") {
74469
+ throw new CliUsageError(
74470
+ `${folder} holds another app's ${APP_MANIFEST_FILE}; pull into an empty folder. Nothing was written.`
74471
+ );
74472
+ }
74473
+ if (claim3 === "other-files" && !args.flags.force) {
74474
+ throw new CliUsageError(
74475
+ `${folder} already holds files that are not this app's; pull into an empty folder, or pass --force. Nothing was written.`
74476
+ );
74477
+ }
74478
+ for (const file3 of pulled.files) {
74479
+ const target = join17(folder, ...file3.path.split("/"));
74480
+ await mkdir15(dirname15(target), { recursive: true });
74481
+ await writeFile16(
74482
+ target,
74483
+ file3.encoding === "base64" ? Buffer.from(file3.content, "base64") : file3.content
74484
+ );
74485
+ }
74486
+ const manifest = {
74487
+ app: pulled.app,
74488
+ collections: Object.fromEntries(
74489
+ pulled.collections.map((collection) => [
74490
+ collection.name,
74491
+ {
74492
+ fields: collection.schema.fields,
74493
+ ...collection.schema.rules ? { rules: collection.schema.rules } : {}
74494
+ }
74495
+ ])
74496
+ )
74497
+ };
74498
+ await writeFile16(join17(folder, APP_MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}
74499
+ `);
74500
+ const names = pulled.collections.map((collection) => collection.name);
74501
+ const where = relative3(context.cwd, folder) || ".";
74502
+ print5({
74503
+ context,
74504
+ args,
74505
+ value: { ...pulled, folder },
74506
+ text: `Pulled ${pulled.files.length} files of ${pulled.app.name} (${site} version ${pulled.version.slice(0, 7)}) into ${where}
74507
+ ` + (names.length ? `Its data: laze app records list <${names.join("|")}> --app ${pulled.app.slug}
74508
+ ` : "It keeps no records.\n")
74509
+ });
74510
+ };
74202
74511
  var appPublish = async ({ context, args }) => {
74203
74512
  const client = await appClient({ context, args });
74204
74513
  const appId = await appIdOf({ client, args, folder: folderOf({ context, word: void 0 }) });
@@ -74649,6 +74958,40 @@ var ACCESS_ACTIONS = {
74649
74958
  approve: ({ client, appId, first, second }) => decideAsk({ client, appId, requestId: first, decision: "granted", role: second }),
74650
74959
  decline: ({ client, appId, first }) => decideAsk({ client, appId, requestId: first, decision: "declined", role: void 0 })
74651
74960
  };
74961
+ function sourceText(source) {
74962
+ switch (source.kind) {
74963
+ case "owner":
74964
+ return "Owner";
74965
+ case "admin":
74966
+ return "Workspace admin";
74967
+ case "direct":
74968
+ return "Shared directly";
74969
+ case "channel":
74970
+ return `via #${source.channelName ?? source.channelId}`;
74971
+ case "workspace":
74972
+ return "Everyone in the workspace";
74973
+ case "agent-owner":
74974
+ return `through its owner ${source.ownerName ?? ""}`.trim();
74975
+ }
74976
+ }
74977
+ var appMembers = async ({ context, args }) => {
74978
+ const { client, appId, name: name2 } = await appOfWord({ context, args, word: args.words[2] });
74979
+ const listed = await client.post("/api/apps/members", { appId });
74980
+ const lines = listed.members.map(
74981
+ (member) => `${member.name} ${member.member.type === "user" ? "person" : "agent"} ${member.role} ${member.sources.map(sourceText).join(", ")}
74982
+ `
74983
+ );
74984
+ const viaChannel = listed.members.some(
74985
+ (member) => !member.removable && member.sources.some((source) => source.kind === "channel")
74986
+ );
74987
+ print5({
74988
+ context,
74989
+ args,
74990
+ value: listed,
74991
+ text: `${name2}: ${listed.members.length} with access
74992
+ ${lines.join("")}` + (viaChannel ? "Access via a channel follows the channel: unpin the app there (laze app unpin --channel <c>) to take it away.\n" : "")
74993
+ });
74994
+ };
74652
74995
  var appAccess = async ({ context, args }) => {
74653
74996
  const client = await appClient({ context, args });
74654
74997
  const appId = await appIdOf({ client, args, folder: folderOf({ context, word: void 0 }) });
@@ -74741,10 +75084,12 @@ var APP_COMMANDS = {
74741
75084
  list: appList,
74742
75085
  push: appPush,
74743
75086
  preview: appPreview,
75087
+ pull: appPull,
74744
75088
  publish: appPublish,
74745
75089
  "make-internal": appMakeInternal,
74746
75090
  unpublish: appUnpublish,
74747
75091
  access: appAccess,
75092
+ members: appMembers,
74748
75093
  name: appName,
74749
75094
  versions: appVersions,
74750
75095
  log: appVersions,
@@ -75957,15 +76302,19 @@ async function channelInfo({ context, args }) {
75957
76302
  const own2 = profile.kind === "agent" ? (await client.get("/api/agents/me/channels")).find(
75958
76303
  (each) => each.id === detail.id
75959
76304
  ) ?? null : null;
76305
+ const pinned = await client.post("/api/apps/pins", { channel: detail.id }).catch(() => null);
75960
76306
  if (args.flags.json) {
75961
- return context.out(`${JSON.stringify({ ...detail, setting: own2 }, null, 2)}
75962
- `);
76307
+ return context.out(
76308
+ `${JSON.stringify({ ...detail, setting: own2, pins: pinned?.pins ?? [] }, null, 2)}
76309
+ `
76310
+ );
75963
76311
  }
75964
76312
  const topic = detail.topic ? `Topic: ${detail.topic}
75965
76313
  ` : "";
75966
76314
  const setting = own2 ? `Your setting here: ${settingTextOf({ channel: own2 })}
75967
76315
  ` : "";
75968
- context.out(`${topic}${formatMembers({ detail })}${setting}`);
76316
+ const tabs = pinned?.pins.length ? pinsText({ channel, listed: pinned }) : "";
76317
+ context.out(`${topic}${formatMembers({ detail })}${setting}${tabs}`);
75969
76318
  }
75970
76319
  async function channelRole({
75971
76320
  context,
@@ -83215,7 +83564,8 @@ function watchingRelease({
83215
83564
  import { readFile as readFile32, rm as rm13 } from "node:fs/promises";
83216
83565
  var WATCH_MS3 = 2e3;
83217
83566
  var RETRY_MS2 = 3e4;
83218
- async function guardRound({ context, client, name: name2, lock, claudePid, session, rush }) {
83567
+ async function guardRound(guard) {
83568
+ const { context, client, name: name2, lock, claudePid, session, rush, launch } = guard;
83219
83569
  const key = session ? sessionKeyOf({ session }) : void 0;
83220
83570
  if (key && await liveElsewhere({ context, key, claudePid, asleepCounts: false })) return true;
83221
83571
  const holder = await holderOf({ path: lock });
@@ -83228,7 +83578,7 @@ async function guardRound({ context, client, name: name2, lock, claudePid, sessi
83228
83578
  if (messages.length === 0) return false;
83229
83579
  await keepTaken({ context, profile: name2, messages });
83230
83580
  const self2 = await currentNameOf({ context, client, profile: name2 });
83231
- const env = { LAZE_WAKE_TEXT: hookContextOf({ messages, self: self2 }) };
83581
+ const env = { ...launch, LAZE_WAKE_TEXT: hookContextOf({ messages, self: self2 }) };
83232
83582
  if (await context.runCommand({ command: rushSendCommand(rush), env }) !== 0) return false;
83233
83583
  await turnStarted({ context, client, agent: name2, messages }).catch(() => void 0);
83234
83584
  await dropFromSpool({ context, profile: name2, messageIds: messages.map((m) => m.messageId) });
@@ -83248,12 +83598,15 @@ async function rushWakeHook({ context, args }) {
83248
83598
  while (context.processes.alive(claudePid)) await context.sleep(WATCH_MS3);
83249
83599
  const { client, name: name2 } = await signedIn({ context, args });
83250
83600
  const noted = statePathOf({ context, kind: "sessions", profile: String(claudePid) });
83251
- const session = await readFile32(noted, "utf8").then(
83601
+ const note = await readFile32(noted, "utf8").then(
83252
83602
  (text2) => JSON.parse(text2),
83253
83603
  () => void 0
83254
83604
  );
83605
+ const { launch = {}, ...session } = note ?? {};
83255
83606
  const lock = statePathOf({ context, kind: "waiters", profile: name2 });
83256
- const guard = { context, client, name: name2, lock, claudePid, session, rush: { id, program } };
83607
+ const rush = { id, program };
83608
+ const known = note ? session : void 0;
83609
+ const guard = { context, client, name: name2, lock, claudePid, session: known, rush, launch };
83257
83610
  const deadline = context.nowMs() + WAIT_HOOK_TIMEOUT_SECONDS * 1e3;
83258
83611
  try {
83259
83612
  while (context.nowMs() < deadline) {
@@ -85920,7 +86273,7 @@ var HELP = `laze: work in a Laze workspace from your terminal or your agent.
85920
86273
  laze agent create --name <name> [--description <text>] [--harness laze-models|claude-code|codex] [--avatar <file>]
85921
86274
  make an agent for your owner (or for you): personal, opened in their direct messages
85922
86275
  --team makes a team agent; on Claude Code or Codex it needs --pool <pool>, a login pool to draw from
85923
- laze agent update <agent> [--name] [--description] [--avatar] [--context-window] change an agent your owner owns
86276
+ laze agent update <agent> [--name] [--description] [--avatar] [--model] [--effort] [--max-context] change an agent your owner owns
85924
86277
  laze agent archive <agent> remove an agent your owner owns; kept 30 days
85925
86278
  laze agent archived removed agents you may restore, with the day each goes
85926
86279
  laze agent restore|delete <agent> bring an archived agent back, or delete it for good now
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazehq/cli",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "description": "The Laze command line: sign in, read and post in chat, and connect your own Claude Code or Codex session as an agent.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",