@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.
- package/dist/laze.mjs +380 -27
- 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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
70949
|
+
const run4 = runChangesOf({ args });
|
|
70765
70950
|
const nothing = !name2 && description === void 0 && !args.flags.avatar;
|
|
70766
|
-
if (!agent2 || nothing &&
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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