@lazehq/cli 0.1.33 → 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 +359 -22
  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.33";
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) });
@@ -69831,6 +69974,9 @@ are waiting, if you think one was missed.
69831
69974
  - \`laze history <channel>\` and \`laze thread <id>\` read a conversation.
69832
69975
  - \`laze search "words"\` searches messages.
69833
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).
69834
69980
 
69835
69981
  If \`laze\` is not on the PATH, run the same commands through \`npx -y @lazehq/cli@latest\`.
69836
69982
  Never print or repeat your Laze key.
@@ -70652,7 +70798,7 @@ function formatLoginActivity({ activity: activity2 }) {
70652
70798
 
70653
70799
  // src/services/agent-manage-commands.service.ts
70654
70800
  var CREATE_USAGE = "Usage: laze agent create --name <name> [--description <text>] [--harness laze-models|claude-code|codex] [--team] [--pool <pool>] [--avatar <file>]";
70655
- 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]";
70656
70802
  var ARCHIVE_USAGE = "Usage: laze agent archive <agent>";
70657
70803
  var PAUSE_USAGE = 'Usage: laze agent pause <agent> [--reason "<why>"] | laze agent resume <agent>';
70658
70804
  var TRANSFER_USAGE = "Usage: laze agent transfer <agent> <member: user id, email or name>";
@@ -70685,13 +70831,40 @@ async function avatarOf({
70685
70831
  return uploaded.avatar;
70686
70832
  }
70687
70833
  function contextWindowOf2({ args }) {
70688
- const value = args.flags["context-window"];
70834
+ const value = args.flags["max-context"] ?? args.flags["context-window"];
70689
70835
  if (value === void 0) return void 0;
70836
+ if (value === "default") return null;
70690
70837
  const match = typeof value === "string" ? /^(\d+(?:\.\d+)?)([kKmM]?)$/.exec(value.trim()) : null;
70691
70838
  if (!match) throw new CliUsageError(UPDATE_USAGE);
70692
70839
  const unit = { k: 1e3, m: 1e6 }[match[2]?.toLowerCase() ?? ""] ?? 1;
70693
70840
  return Math.round(Number(match[1]) * unit);
70694
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
+ }
70695
70868
  function descriptionOf({ args }) {
70696
70869
  const value = args.flags.description;
70697
70870
  return typeof value === "string" ? value : void 0;
@@ -70773,9 +70946,9 @@ async function updateAgent({
70773
70946
  const agent2 = args.words[2];
70774
70947
  const name2 = flagText({ args, name: "name" }).trim();
70775
70948
  const description = descriptionOf({ args });
70776
- const contextWindow = contextWindowOf2({ args });
70949
+ const run4 = runChangesOf({ args });
70777
70950
  const nothing = !name2 && description === void 0 && !args.flags.avatar;
70778
- 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);
70779
70952
  const { client } = await signedIn({ context, args });
70780
70953
  const avatar = await avatarOf({ context, args, client });
70781
70954
  const updated = await client.post("/api/agents/update", {
@@ -70783,14 +70956,14 @@ async function updateAgent({
70783
70956
  ...name2 && { name: name2 },
70784
70957
  ...description !== void 0 && { description },
70785
70958
  ...avatar !== void 0 && { avatar },
70786
- ...contextWindow !== void 0 && { contextWindow }
70959
+ ...run4
70787
70960
  });
70788
70961
  if (args.flags.json) return context.out(`${JSON.stringify(updated, null, 2)}
70789
70962
  `);
70790
70963
  context.out(
70791
70964
  [
70792
70965
  `Updated ${updated.name}.`,
70793
- ...updated.contextWindow ? [`Its context window is ${updated.contextWindow.toLocaleString("en-GB")} tokens.`] : [],
70966
+ ...runLinesOf({ agent: updated }),
70794
70967
  ...mentionLinesOf({ agentId: updated.id, name: updated.name }),
70795
70968
  ""
70796
70969
  ].join("\n")
@@ -71783,6 +71956,13 @@ var appPreviewSchemaDefinition = external_exports.object({
71783
71956
  /** The site's own origin; opening it signs the person in through Laze. */
71784
71957
  url: external_exports.string()
71785
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
+ });
71786
71966
  var exportRecordsInputSchemaDefinition = external_exports.object({
71787
71967
  ...siteRefSchemaDefinition.shape,
71788
71968
  collection: collectionNameSchema,
@@ -72031,6 +72211,27 @@ var appAccessRequestSchemaDefinition = external_exports.object({
72031
72211
  decidedAt: external_exports.iso.datetime().nullable()
72032
72212
  });
72033
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;
72034
72235
  var appAccessSchemaDefinition = external_exports.object({
72035
72236
  appId: external_exports.string().min(1),
72036
72237
  visibility: appVisibilitySchema,
@@ -72510,7 +72711,7 @@ var appBackupCheckAlertsSchemaDefinition = external_exports.object({
72510
72711
  });
72511
72712
 
72512
72713
  // ../../modules/app/contract/src/app.trpc.ts
72513
- 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();
72514
72715
  var appConnectionsTrpc = defineTrpcContract("app").query("connections").withInput(appRefSchema).withOutput(appConnectionsSchema).mutation("allowConnection").withInput(appConnectionRefSchema).withOutput(appConnectionsSchema).mutation("revokeConnection").withInput(appConnectionRefSchema).withOutput(appConnectionsSchema).build();
72515
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();
72516
72717
  var appTrpc = joinTrpcContracts("app", appMainTrpc, appConnectionsTrpc, appPinsTrpc);
@@ -72624,6 +72825,12 @@ var appCliCommands = [
72624
72825
  arguments: ["--site draft|published"],
72625
72826
  summary: "Print the address of the draft preview (or the published app)"
72626
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
+ },
72627
72834
  {
72628
72835
  command: "laze app publish",
72629
72836
  operation: "requestPublish",
@@ -72642,6 +72849,12 @@ var appCliCommands = [
72642
72849
  arguments: [],
72643
72850
  summary: "Take the published address offline at once; the data stays"
72644
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
+ },
72645
72858
  {
72646
72859
  command: "laze app access",
72647
72860
  operation: "getAccess",
@@ -73722,6 +73935,16 @@ function print3({
73722
73935
  context.out(args.flags.json ? `${JSON.stringify(value, null, 2)}
73723
73936
  ` : text2);
73724
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
+ }
73725
73948
  function pinsText({ channel, listed }) {
73726
73949
  if (listed.pins.length === 0) {
73727
73950
  return `No apps are pinned to ${channel}. laze app pin --channel ${channel} pins one.
@@ -73729,7 +73952,7 @@ function pinsText({ channel, listed }) {
73729
73952
  }
73730
73953
  const lines = listed.pins.map(
73731
73954
  (pin) => `${pin.name} ${pin.appId} pinned by ${pin.pinnedByName ?? pin.pinnedBy.id} ${pin.pinnedAt.slice(0, 10)}
73732
- `
73955
+ ` + readLineOf(pin)
73733
73956
  );
73734
73957
  return `Pinned to ${channel}:
73735
73958
  ${lines.join("")}`;
@@ -74211,6 +74434,80 @@ var appPreview = async ({ context, args }) => {
74211
74434
  print5({ context, args, value: preview, text: `${preview.url}
74212
74435
  ` });
74213
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
+ };
74214
74511
  var appPublish = async ({ context, args }) => {
74215
74512
  const client = await appClient({ context, args });
74216
74513
  const appId = await appIdOf({ client, args, folder: folderOf({ context, word: void 0 }) });
@@ -74661,6 +74958,40 @@ var ACCESS_ACTIONS = {
74661
74958
  approve: ({ client, appId, first, second }) => decideAsk({ client, appId, requestId: first, decision: "granted", role: second }),
74662
74959
  decline: ({ client, appId, first }) => decideAsk({ client, appId, requestId: first, decision: "declined", role: void 0 })
74663
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
+ };
74664
74995
  var appAccess = async ({ context, args }) => {
74665
74996
  const client = await appClient({ context, args });
74666
74997
  const appId = await appIdOf({ client, args, folder: folderOf({ context, word: void 0 }) });
@@ -74753,10 +75084,12 @@ var APP_COMMANDS = {
74753
75084
  list: appList,
74754
75085
  push: appPush,
74755
75086
  preview: appPreview,
75087
+ pull: appPull,
74756
75088
  publish: appPublish,
74757
75089
  "make-internal": appMakeInternal,
74758
75090
  unpublish: appUnpublish,
74759
75091
  access: appAccess,
75092
+ members: appMembers,
74760
75093
  name: appName,
74761
75094
  versions: appVersions,
74762
75095
  log: appVersions,
@@ -75969,15 +76302,19 @@ async function channelInfo({ context, args }) {
75969
76302
  const own2 = profile.kind === "agent" ? (await client.get("/api/agents/me/channels")).find(
75970
76303
  (each) => each.id === detail.id
75971
76304
  ) ?? null : null;
76305
+ const pinned = await client.post("/api/apps/pins", { channel: detail.id }).catch(() => null);
75972
76306
  if (args.flags.json) {
75973
- return context.out(`${JSON.stringify({ ...detail, setting: own2 }, null, 2)}
75974
- `);
76307
+ return context.out(
76308
+ `${JSON.stringify({ ...detail, setting: own2, pins: pinned?.pins ?? [] }, null, 2)}
76309
+ `
76310
+ );
75975
76311
  }
75976
76312
  const topic = detail.topic ? `Topic: ${detail.topic}
75977
76313
  ` : "";
75978
76314
  const setting = own2 ? `Your setting here: ${settingTextOf({ channel: own2 })}
75979
76315
  ` : "";
75980
- context.out(`${topic}${formatMembers({ detail })}${setting}`);
76316
+ const tabs = pinned?.pins.length ? pinsText({ channel, listed: pinned }) : "";
76317
+ context.out(`${topic}${formatMembers({ detail })}${setting}${tabs}`);
75981
76318
  }
75982
76319
  async function channelRole({
75983
76320
  context,
@@ -85936,7 +86273,7 @@ var HELP = `laze: work in a Laze workspace from your terminal or your agent.
85936
86273
  laze agent create --name <name> [--description <text>] [--harness laze-models|claude-code|codex] [--avatar <file>]
85937
86274
  make an agent for your owner (or for you): personal, opened in their direct messages
85938
86275
  --team makes a team agent; on Claude Code or Codex it needs --pool <pool>, a login pool to draw from
85939
- 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
85940
86277
  laze agent archive <agent> remove an agent your owner owns; kept 30 days
85941
86278
  laze agent archived removed agents you may restore, with the day each goes
85942
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.33",
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",