@anna-ai/cli 0.1.41 → 0.1.43
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/{app-bundle-upload-B6TJeyOq.js → app-bundle-upload-DgoZIhQG.js} +22 -9
- package/dist/{apps-cut-Crx0WrpZ.js → apps-cut-DdUPSftG.js} +3 -3
- package/dist/{apps-discard-Bmj0-j_T.js → apps-discard-Clj8s4Wp.js} +3 -3
- package/dist/{apps-publish-bcqO88S0.js → apps-publish-CqN0w8sw.js} +2 -2
- package/dist/{apps-publish-DnU-B7YF.js → apps-publish-DiSpTGHD.js} +3 -3
- package/dist/{apps-push-CnZdmaYm.js → apps-push-DfN35REI.js} +5 -5
- package/dist/{apps-release-CX7FtoOH.js → apps-release-KoREGpKk.js} +1 -1
- package/dist/{apps-sync-meta-CL2PCMCv.js → apps-sync-meta-32oHqPlp.js} +1 -1
- package/dist/bridge-C50uFYgg.js +3 -0
- package/dist/{bridge-Bnpq2I_T.js → bridge-CI8SVwa1.js} +1 -1
- package/dist/cli.js +11 -11
- package/dist/dev-BsXFe69I.js +4 -0
- package/dist/{dev-DEGmXqc_.js → dev-CpKjkENF.js} +2 -2
- package/dist/{doctor-Dm6TNsq6.js → doctor-BQS1YvsY.js} +1 -1
- package/dist/{executa-dev-CnWCz6Of.js → executa-dev-Cnj6bItj.js} +1 -1
- package/dist/{executa-install-jSVVx6oh.js → executa-install-47WBVYen.js} +1 -1
- package/dist/executa-install-BQKJIpxE.js +7 -0
- package/dist/{listing-meta-CtVtyaWu.js → listing-meta-CSopUol3.js} +24 -0
- package/dist/{publish-BQL5NDnd.js → publish-B67_cXdw.js} +3 -3
- package/dist/{server-3aUfxWXU.js → server-Bzp3R6EX.js} +1 -1
- package/dist/{working-orchestration-oFZwsWqQ.js → working-orchestration-BFMpQ6r1.js} +1 -1
- package/package.json +1 -1
- package/dist/bridge-CL8HLo-I.js +0 -3
- package/dist/dev-C0sHLKn_.js +0 -4
- package/dist/executa-install-Q8zSREKQ.js +0 -7
|
@@ -29,9 +29,16 @@ const CONTENT_TYPES = {
|
|
|
29
29
|
md: "text/markdown"
|
|
30
30
|
};
|
|
31
31
|
const MAX_TOTAL_BYTES = 1024 * 1024 * 1024;
|
|
32
|
-
const MAX_FILE_BYTES =
|
|
32
|
+
const MAX_FILE_BYTES = 50 * 1024 * 1024;
|
|
33
33
|
const MAX_FILES = 2e3;
|
|
34
34
|
const UPLOAD_PARALLEL = 4;
|
|
35
|
+
const fmtMB = (n) => (n / 1024 / 1024).toFixed(2);
|
|
36
|
+
function totalSizeError(totalBytes) {
|
|
37
|
+
return new CliError(`bundle is ${fmtMB(totalBytes)} MB — exceeds the ${fmtMB(MAX_TOTAL_BYTES)} MB publish limit.\n Tip: preview/screenshot images usually shrink 5-10x when exported as WebP/AVIF\n thumbnails sized for their on-screen dimensions. Unchanged files are deduplicated\n server-side, so only new bytes upload on re-publish. Assets that must stay large\n belong in executa binary distribution, not the UI bundle.`, 4);
|
|
38
|
+
}
|
|
39
|
+
function fileSizeError(relativePath, byteSize) {
|
|
40
|
+
return new CliError(`bundle file exceeds the ${fmtMB(MAX_FILE_BYTES)} MB per-file limit: ${relativePath} (${fmtMB(byteSize)} MB).\n Compress/split the asset, or ship it via executa binary distribution.`, 4);
|
|
41
|
+
}
|
|
35
42
|
function guessContentType(name) {
|
|
36
43
|
const m = /\.([a-z0-9]+)$/i.exec(name);
|
|
37
44
|
if (!m) return "application/octet-stream";
|
|
@@ -88,9 +95,9 @@ async function uploadAppBundle(params) {
|
|
|
88
95
|
if (files.length === 0) throw new CliError(`bundle directory is empty: ${bundleDir}`, 4);
|
|
89
96
|
if (files.length > MAX_FILES) throw new CliError(`too many bundle files (${files.length} > ${MAX_FILES})`, 4);
|
|
90
97
|
const totalBytes = files.reduce((s, f) => s + f.entry.byte_size, 0);
|
|
91
|
-
if (totalBytes > MAX_TOTAL_BYTES) throw
|
|
98
|
+
if (totalBytes > MAX_TOTAL_BYTES) throw totalSizeError(totalBytes);
|
|
92
99
|
const tooBig = files.find((f) => f.entry.byte_size > MAX_FILE_BYTES);
|
|
93
|
-
if (tooBig) throw
|
|
100
|
+
if (tooBig) throw fileSizeError(tooBig.relativePath, tooBig.entry.byte_size);
|
|
94
101
|
if (!files.some((f) => f.relativePath === entryPath)) throw new CliError(`manifest entry "${entryPath}" not found in bundle dir ${bundleDir}`, 4);
|
|
95
102
|
const fingerprint = manifestFingerprint(files);
|
|
96
103
|
const existing = await getBundle(client, appId, versionId);
|
|
@@ -117,7 +124,10 @@ async function uploadAppBundle(params) {
|
|
|
117
124
|
external_origins: externalOrigins
|
|
118
125
|
});
|
|
119
126
|
const proxyByPath = new Map(initResp.files.map((p) => [p.relative_path, p.proxy_upload_url]));
|
|
120
|
-
const
|
|
127
|
+
const skipSet = new Set(initResp.files.filter((p) => p.skip_upload).map((p) => p.relative_path));
|
|
128
|
+
const toUpload = files.filter((f) => !skipSet.has(f.relativePath));
|
|
129
|
+
if (skipSet.size > 0) log?.(` ♻ ${skipSet.size}/${files.length} files unchanged on server — skipped (dedup)`);
|
|
130
|
+
const queue = [...toUpload];
|
|
121
131
|
const uploadOne = async () => {
|
|
122
132
|
for (;;) {
|
|
123
133
|
const f = queue.shift();
|
|
@@ -129,7 +139,7 @@ async function uploadAppBundle(params) {
|
|
|
129
139
|
await uploadBundleFile(client, appId, versionId, f.relativePath, blob);
|
|
130
140
|
}
|
|
131
141
|
};
|
|
132
|
-
await Promise.all(Array.from({ length: Math.min(UPLOAD_PARALLEL,
|
|
142
|
+
await Promise.all(Array.from({ length: Math.min(UPLOAD_PARALLEL, toUpload.length) }, uploadOne));
|
|
133
143
|
const detail = await finalizeBundle(client, appId, versionId, false);
|
|
134
144
|
log?.(` ✓ bundle finalized (${detail.file_count} files, status=${detail.status})`);
|
|
135
145
|
return {
|
|
@@ -158,9 +168,9 @@ async function uploadWorkingBundle(params) {
|
|
|
158
168
|
if (files.length === 0) throw new CliError(`bundle directory is empty: ${bundleDir}`, 4);
|
|
159
169
|
if (files.length > MAX_FILES) throw new CliError(`too many bundle files (${files.length} > ${MAX_FILES})`, 4);
|
|
160
170
|
const totalBytes = files.reduce((s, f) => s + f.entry.byte_size, 0);
|
|
161
|
-
if (totalBytes > MAX_TOTAL_BYTES) throw
|
|
171
|
+
if (totalBytes > MAX_TOTAL_BYTES) throw totalSizeError(totalBytes);
|
|
162
172
|
const tooBig = files.find((f) => f.entry.byte_size > MAX_FILE_BYTES);
|
|
163
|
-
if (tooBig) throw
|
|
173
|
+
if (tooBig) throw fileSizeError(tooBig.relativePath, tooBig.entry.byte_size);
|
|
164
174
|
if (!files.some((f) => f.relativePath === entryPath)) throw new CliError(`manifest entry "${entryPath}" not found in bundle dir ${bundleDir}`, 4);
|
|
165
175
|
const fingerprint = manifestFingerprint(files);
|
|
166
176
|
if (knownFingerprint && knownFingerprint === fingerprint) {
|
|
@@ -185,7 +195,10 @@ async function uploadWorkingBundle(params) {
|
|
|
185
195
|
external_origins: externalOrigins
|
|
186
196
|
});
|
|
187
197
|
const proxyByPath = new Map(initResp.files.map((p) => [p.relative_path, p.proxy_upload_url]));
|
|
188
|
-
const
|
|
198
|
+
const skipSet = new Set(initResp.files.filter((p) => p.skip_upload).map((p) => p.relative_path));
|
|
199
|
+
const toUpload = files.filter((f) => !skipSet.has(f.relativePath));
|
|
200
|
+
if (skipSet.size > 0) log?.(` ♻ ${skipSet.size}/${files.length} files unchanged on server — skipped (dedup)`);
|
|
201
|
+
const queue = [...toUpload];
|
|
189
202
|
const uploadOne = async () => {
|
|
190
203
|
for (;;) {
|
|
191
204
|
const f = queue.shift();
|
|
@@ -197,7 +210,7 @@ async function uploadWorkingBundle(params) {
|
|
|
197
210
|
await uploadWorkingBundleFile(client, appId, f.relativePath, blob);
|
|
198
211
|
}
|
|
199
212
|
};
|
|
200
|
-
await Promise.all(Array.from({ length: Math.min(UPLOAD_PARALLEL,
|
|
213
|
+
await Promise.all(Array.from({ length: Math.min(UPLOAD_PARALLEL, toUpload.length) }, uploadOne));
|
|
201
214
|
const detail = await finalizeWorkingBundle(client, appId, false);
|
|
202
215
|
log?.(` ✓ working bundle staged (${detail.file_count} files, status=${detail.bundle_status})`);
|
|
203
216
|
return {
|
|
@@ -10,10 +10,10 @@ import "./executas-CvQY_w2U.js";
|
|
|
10
10
|
import "./executa-publish-DueD_0hh.js";
|
|
11
11
|
import "./binary-upload-CKMU5Rfw.js";
|
|
12
12
|
import { uploadExecutaBinaries } from "./executa-upload-binaries-DURJTXRI.js";
|
|
13
|
-
import "./dev-
|
|
14
|
-
import "./executa-install-
|
|
13
|
+
import "./dev-CpKjkENF.js";
|
|
14
|
+
import "./executa-install-47WBVYen.js";
|
|
15
15
|
import "./app-cache-Cr3tKbux.js";
|
|
16
|
-
import { resolveAppBySlugOrCache } from "./working-orchestration-
|
|
16
|
+
import { resolveAppBySlugOrCache } from "./working-orchestration-BFMpQ6r1.js";
|
|
17
17
|
import { resolve } from "node:path";
|
|
18
18
|
import { existsSync } from "node:fs";
|
|
19
19
|
import { bold, cyan, dim, green, yellow } from "kleur/colors";
|
|
@@ -10,10 +10,10 @@ import "./executas-CvQY_w2U.js";
|
|
|
10
10
|
import "./executa-publish-DueD_0hh.js";
|
|
11
11
|
import "./binary-upload-CKMU5Rfw.js";
|
|
12
12
|
import "./executa-upload-binaries-DURJTXRI.js";
|
|
13
|
-
import "./dev-
|
|
14
|
-
import "./executa-install-
|
|
13
|
+
import "./dev-CpKjkENF.js";
|
|
14
|
+
import "./executa-install-47WBVYen.js";
|
|
15
15
|
import "./app-cache-Cr3tKbux.js";
|
|
16
|
-
import { resolveAppBySlugOrCache } from "./working-orchestration-
|
|
16
|
+
import { resolveAppBySlugOrCache } from "./working-orchestration-BFMpQ6r1.js";
|
|
17
17
|
import { dim, green, yellow } from "kleur/colors";
|
|
18
18
|
|
|
19
19
|
//#region src/commands/apps-discard.ts
|
|
@@ -6,8 +6,8 @@ import { parseExecutaIdOverrides, readExecutasLock, substituteBundledRefs, valid
|
|
|
6
6
|
import { loadAppManifest } from "./manifest-CAF3_r1T.js";
|
|
7
7
|
import { bumpVersion, bundleHash, manifestHash, rewriteVersion, runExecutaPublish } from "./executa-publish-DueD_0hh.js";
|
|
8
8
|
import { appCacheMatches, readAppIdentity, writeAppIdentity } from "./app-cache-Cr3tKbux.js";
|
|
9
|
-
import { syncAppListingMeta } from "./listing-meta-
|
|
10
|
-
import { isExistingDir, uploadAppBundle } from "./app-bundle-upload-
|
|
9
|
+
import { syncAppListingMeta } from "./listing-meta-CSopUol3.js";
|
|
10
|
+
import { isExistingDir, uploadAppBundle } from "./app-bundle-upload-DgoZIhQG.js";
|
|
11
11
|
import { resolve } from "node:path";
|
|
12
12
|
import { bold, cyan, dim, green, yellow } from "kleur/colors";
|
|
13
13
|
|
|
@@ -10,8 +10,8 @@ import "./executa-publish-DueD_0hh.js";
|
|
|
10
10
|
import "./binary-upload-CKMU5Rfw.js";
|
|
11
11
|
import "./executa-upload-binaries-DURJTXRI.js";
|
|
12
12
|
import "./app-cache-Cr3tKbux.js";
|
|
13
|
-
import "./listing-meta-
|
|
14
|
-
import "./app-bundle-upload-
|
|
15
|
-
import { runAppsPublish } from "./apps-publish-
|
|
13
|
+
import "./listing-meta-CSopUol3.js";
|
|
14
|
+
import "./app-bundle-upload-DgoZIhQG.js";
|
|
15
|
+
import { runAppsPublish } from "./apps-publish-CqN0w8sw.js";
|
|
16
16
|
|
|
17
17
|
export { runAppsPublish };
|
|
@@ -10,12 +10,12 @@ import "./executas-CvQY_w2U.js";
|
|
|
10
10
|
import { bumpVersion, bundleHash, manifestHash, rewriteVersion } from "./executa-publish-DueD_0hh.js";
|
|
11
11
|
import "./binary-upload-CKMU5Rfw.js";
|
|
12
12
|
import "./executa-upload-binaries-DURJTXRI.js";
|
|
13
|
-
import "./dev-
|
|
14
|
-
import "./executa-install-
|
|
13
|
+
import "./dev-CpKjkENF.js";
|
|
14
|
+
import "./executa-install-47WBVYen.js";
|
|
15
15
|
import "./app-cache-Cr3tKbux.js";
|
|
16
|
-
import { installLocalBundledShims, resolveAppIdentity, resolveBundledExecutas } from "./working-orchestration-
|
|
17
|
-
import { syncAppListingMeta } from "./listing-meta-
|
|
18
|
-
import { isExistingDir, uploadWorkingBundle } from "./app-bundle-upload-
|
|
16
|
+
import { installLocalBundledShims, resolveAppIdentity, resolveBundledExecutas } from "./working-orchestration-BFMpQ6r1.js";
|
|
17
|
+
import { syncAppListingMeta } from "./listing-meta-CSopUol3.js";
|
|
18
|
+
import { isExistingDir, uploadWorkingBundle } from "./app-bundle-upload-DgoZIhQG.js";
|
|
19
19
|
import { resolve } from "node:path";
|
|
20
20
|
import { bold, cyan, dim, green, yellow } from "kleur/colors";
|
|
21
21
|
|
|
@@ -59,7 +59,7 @@ async function runAppsRelease(opts) {
|
|
|
59
59
|
if (!target) {
|
|
60
60
|
if (opts.allowCreate) {
|
|
61
61
|
if (!opts.json) console.log(yellow(`version ${opts.version} not found remotely; running 'apps publish' first (--allow-create)…`));
|
|
62
|
-
const { runAppsPublish } = await import("./apps-publish-
|
|
62
|
+
const { runAppsPublish } = await import("./apps-publish-DiSpTGHD.js");
|
|
63
63
|
const code = await runAppsPublish({
|
|
64
64
|
cwd: opts.cwd,
|
|
65
65
|
account: opts.account,
|
|
@@ -4,7 +4,7 @@ import { CliError } from "./client-D-_z1ALk.js";
|
|
|
4
4
|
import { resolveClient, withErrorHandling } from "./_lifecycle-shared-RyiRITI5.js";
|
|
5
5
|
import { loadAppManifest } from "./manifest-CAF3_r1T.js";
|
|
6
6
|
import { readAppIdentity } from "./app-cache-Cr3tKbux.js";
|
|
7
|
-
import { syncAppListingMeta } from "./listing-meta-
|
|
7
|
+
import { syncAppListingMeta } from "./listing-meta-CSopUol3.js";
|
|
8
8
|
import { resolve } from "node:path";
|
|
9
9
|
import { bold, cyan, dim, green } from "kleur/colors";
|
|
10
10
|
|
|
@@ -9,7 +9,7 @@ import { createInterface } from "node:readline";
|
|
|
9
9
|
* `uvx <pkg>@<version>` so end users always run the dispatcher version
|
|
10
10
|
* the CLI was tested against.
|
|
11
11
|
*/
|
|
12
|
-
const PINNED_RUNTIME_VERSION = "0.2.
|
|
12
|
+
const PINNED_RUNTIME_VERSION = "0.2.0a19";
|
|
13
13
|
/**
|
|
14
14
|
* Throwable from a {@link RequestHandler} to send a structured JSON-RPC
|
|
15
15
|
* error back to the python bridge with a stable string ``code`` (e.g.
|
package/dist/cli.js
CHANGED
|
@@ -474,7 +474,7 @@ program.command("validate").description("Run schema + ACL checks on a manifest+b
|
|
|
474
474
|
process.exit(code);
|
|
475
475
|
});
|
|
476
476
|
program.command("dev").description("Run a local harness (in-process dispatcher + iframe + SSE relay)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--bundle <dir>", "bundle directory (default: ./bundle)").option("--slug <slug>", "App slug (overrides manifest.slug/name)").option("--view <name>", "View name to open (default: manifest default)").option("--matrix-nexus-root <path>", "matrix-nexus checkout (auto-detected if omitted; can also use $ANNA_NEXUS_ROOT)").option("--port <number>", "HTTP port", "5180").option("--user-id <id>", "Harness user_id", "1").option("--cwd <dir>", "Project root (default: cwd)").option("--no-watch", "Disable bundle file watcher (default: enabled)").option("--executa <spec>", "Explicit executa registration; repeatable. Spec: comma-separated key=value (dir=<path>[,tool_id=<id>][,type=python|node|go|binary][,command=\"<argv>\"]). When only `dir=` is given, the executa is auto-detected from executa.json / pyproject.toml / package.json / go.mod. Overrides directory auto-discovery under <manifest-dir>/executas/.", (val, prev) => prev ? [...prev, val] : [val]).option("--no-llm", "Disable LLM bridge (anna.llm/agent return llm_disabled)").option("--mock-llm <fixture>", "Serve canned LLM responses from a JSONL fixture").option("--llm-account <host>", "Saved account host to use (default: current)").option("--llm-app-slug <slug>", "Override the manifest slug used to register / look up the dev AnnaApp (default: manifest.slug)").option("--storage <mode>", "Storage backend: \"legacy\" (in-memory runtime_state, default) or \"aps\" (real nexus APS via /api/v1/storage/* — requires `anna-app login`).", "legacy").option("--web <mode>", "Web backend: \"local\" (keyless ddgs + stdlib fetcher, free, default) or \"real\" (platform web service via /api/v1/copilot/app/web/* — production provider chain + normal CU billing; requires `anna-app login`).", "local").action(async (opts) => {
|
|
477
|
-
const { runDev, parseExecutaSpec } = await import("./dev-
|
|
477
|
+
const { runDev, parseExecutaSpec } = await import("./dev-BsXFe69I.js");
|
|
478
478
|
const cwd = opts.cwd ?? process.cwd();
|
|
479
479
|
let executas;
|
|
480
480
|
if (opts.executa && opts.executa.length > 0) {
|
|
@@ -534,7 +534,7 @@ fixture.command("replay <file>").description("Dry-run replay of a harness record
|
|
|
534
534
|
process.exit(code);
|
|
535
535
|
});
|
|
536
536
|
program.command("doctor").description("Check environment for `anna-app dev` (uv, matrix-nexus, dev key)").option("--matrix-nexus-root <path>", "matrix-nexus checkout (optional)").action(async (opts) => {
|
|
537
|
-
const { runDoctor } = await import("./doctor-
|
|
537
|
+
const { runDoctor } = await import("./doctor-BQS1YvsY.js");
|
|
538
538
|
const code = await runDoctor({ matrixNexusRoot: opts.matrixNexusRoot });
|
|
539
539
|
process.exit(code);
|
|
540
540
|
});
|
|
@@ -597,7 +597,7 @@ executa.command("register").description("Register a HARNESS AnnaApp(kind=executa
|
|
|
597
597
|
process.exit(code);
|
|
598
598
|
});
|
|
599
599
|
executa.command("install").description("Install a local-dev shim for an Executa under its minted tool_id so the Agent can discover it via 'Rediscover Local' (for distribution_type: local). Resolves the tool_id from .anna/executa.json (written by `executa publish` / `apps push`) unless --tool-id is given.").option("--dir <path>", "Executa project dir (default: CWD)").option("--tool-id <id>", "Install the shim under this exact id (default: minted id from .anna/executa.json, else executa.json tool_id)").option("--bin-dir <path>", "Install dir for the shim (default: ~/.anna/executa/bin)").option("--force", "Overwrite an existing shim of the same name", false).option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
|
|
600
|
-
const { runExecutaInstall } = await import("./executa-install-
|
|
600
|
+
const { runExecutaInstall } = await import("./executa-install-BQKJIpxE.js");
|
|
601
601
|
const code = await runExecutaInstall({
|
|
602
602
|
dir: opts.dir,
|
|
603
603
|
toolId: opts.toolId,
|
|
@@ -608,7 +608,7 @@ executa.command("install").description("Install a local-dev shim for an Executa
|
|
|
608
608
|
process.exit(code);
|
|
609
609
|
});
|
|
610
610
|
executa.command("dev").description("Run one Executa plugin in isolation (REPL or one-shot describe/invoke)").option("--dir <path>", "Executa project dir (default: CWD)").option("--spec <spec>", "Override discovery: comma-separated key=value (tool_id=...,type=...,command=\"...\")").option("--describe", "Print MANIFEST and exit", false).option("--health", "Print health and exit", false).option("--invoke <tool>", "Invoke one tool and exit").option("--args <json>", "JSON object passed as tool arguments", "{}").option("--json", "One-shot: emit compact JSON (no banners)", false).option("--no-sampling", "Hard-disable sampling reverse RPC (returns sampling_disabled)").option("--mock-sampling <fixture>", "Serve canned sampling responses from a JSONL fixture (offline)").option("--sampling-unsupported-format", "Simulate a model without json_schema support — exercises responseFormat onUnsupported branches (-32010 / downgrade)").option("--app-slug <slug>", "Forward sampling to nexus on behalf of this dev AnnaApp slug").option("--sampling-account <host>", "Saved account host for nexus sampling (default: current)").option("--no-agent", "Hard-disable agent reverse RPC (returns agent_not_granted)").option("--mock-agent <fixture>", "Serve canned agent/* responses from a JSONL fixture (offline)").option("--agent-account <host>", "Saved account host for nexus agent (default: --sampling-account or current)").option("--storage <mode>", "Storage backend: off | memory | mock | real (default: memory)").option("--mock-storage <fixture>", "Serve canned storage/* + files/* responses from a JSONL fixture").option("--storage-account <host>", "Saved account host for nexus storage (default: --sampling-account or current)").option("--storage-scopes <list>", "Comma-separated scopes for real storage tokens (default: user,app,tool)").option("--no-image", "Hard-disable image reverse RPC (returns image_not_granted)").option("--mock-image <fixture>", "Serve canned image/generate + image/edit responses from a JSONL fixture").option("--image-account <host>", "Saved account host for nexus image (default: --sampling-account or current)").option("--no-upload", "Hard-disable host/uploadFile reverse RPC (returns upload_not_granted)").option("--mock-upload <fixture>", "Serve canned host/uploadFile responses from a JSONL fixture").option("--upload-account <host>", "Saved account host for nexus uploads (default: --sampling-account or current)").action(async (opts) => {
|
|
611
|
-
const { runExecutaDev } = await import("./executa-dev-
|
|
611
|
+
const { runExecutaDev } = await import("./executa-dev-Cnj6bItj.js");
|
|
612
612
|
const storageMode = opts.storage === void 0 ? void 0 : (() => {
|
|
613
613
|
const m = opts.storage;
|
|
614
614
|
if (m === "off" || m === "memory" || m === "mock" || m === "real") return m;
|
|
@@ -671,7 +671,7 @@ apps.command("publish").description("Publish or update an Anna App (manifest.jso
|
|
|
671
671
|
console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
|
|
672
672
|
process.exit(2);
|
|
673
673
|
}
|
|
674
|
-
const { runAppsPublish } = await import("./apps-publish-
|
|
674
|
+
const { runAppsPublish } = await import("./apps-publish-DiSpTGHD.js");
|
|
675
675
|
process.exit(await runAppsPublish({
|
|
676
676
|
cwd: opts.cwd,
|
|
677
677
|
manifest: opts.manifest,
|
|
@@ -705,7 +705,7 @@ apps.command("push").description("Upsert the mutable working draft (manifest + b
|
|
|
705
705
|
process.exit(2);
|
|
706
706
|
}
|
|
707
707
|
}
|
|
708
|
-
const { runAppsPush } = await import("./apps-push-
|
|
708
|
+
const { runAppsPush } = await import("./apps-push-DfN35REI.js");
|
|
709
709
|
process.exit(await runAppsPush({
|
|
710
710
|
cwd: opts.cwd,
|
|
711
711
|
manifest: opts.manifest,
|
|
@@ -725,7 +725,7 @@ apps.command("push").description("Upsert the mutable working draft (manifest + b
|
|
|
725
725
|
}));
|
|
726
726
|
});
|
|
727
727
|
apps.command("cut <version>").description("Snapshot the working draft into an immutable version (freeze deps)").option("--changelog <text>", "Override the working draft changelog for this version").option("--slug <slug>", "App slug (default: resolve from .anna/app.json cache)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--dry-run", "Resolve target but don't cut", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (version, opts) => {
|
|
728
|
-
const { runAppsCut } = await import("./apps-cut-
|
|
728
|
+
const { runAppsCut } = await import("./apps-cut-DdUPSftG.js");
|
|
729
729
|
process.exit(await runAppsCut({
|
|
730
730
|
version,
|
|
731
731
|
changelog: opts.changelog,
|
|
@@ -737,7 +737,7 @@ apps.command("cut <version>").description("Snapshot the working draft into an im
|
|
|
737
737
|
}));
|
|
738
738
|
});
|
|
739
739
|
apps.command("discard").description("Drop the mutable working draft (leaves cut versions intact)").option("--slug <slug>", "App slug (default: resolve from .anna/app.json cache)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--dry-run", "Resolve target but don't discard", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
|
|
740
|
-
const { runAppsDiscard } = await import("./apps-discard-
|
|
740
|
+
const { runAppsDiscard } = await import("./apps-discard-Clj8s4Wp.js");
|
|
741
741
|
process.exit(await runAppsDiscard({
|
|
742
742
|
slug: opts.slug,
|
|
743
743
|
cwd: opts.cwd,
|
|
@@ -747,7 +747,7 @@ apps.command("discard").description("Drop the mutable working draft (leaves cut
|
|
|
747
747
|
}));
|
|
748
748
|
});
|
|
749
749
|
apps.command("release <version>").description("Freeze & publish an existing remote version (go live)").option("--slug <slug>", "App slug (default: resolve from .anna/app.json cache)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--allow-create", "If the version isn't on the server, run 'apps publish' first, then release", false).option("--dry-run", "Resolve target + pre-flight but don't publish", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (version, opts) => {
|
|
750
|
-
const { runAppsRelease } = await import("./apps-release-
|
|
750
|
+
const { runAppsRelease } = await import("./apps-release-KoREGpKk.js");
|
|
751
751
|
process.exit(await runAppsRelease({
|
|
752
752
|
version,
|
|
753
753
|
slug: opts.slug,
|
|
@@ -759,7 +759,7 @@ apps.command("release <version>").description("Freeze & publish an existing remo
|
|
|
759
759
|
}));
|
|
760
760
|
});
|
|
761
761
|
apps.command("sync-meta").description("Push mutable store metadata (name/tagline/…) from the manifest").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--logo <path>", "Local logo file to upload (overrides app.json logo_file)").option("--dry-run", "Print the metadata diff but don't PATCH", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
|
|
762
|
-
const { runAppsSyncMeta } = await import("./apps-sync-meta-
|
|
762
|
+
const { runAppsSyncMeta } = await import("./apps-sync-meta-32oHqPlp.js");
|
|
763
763
|
process.exit(await runAppsSyncMeta({
|
|
764
764
|
cwd: opts.cwd,
|
|
765
765
|
manifest: opts.manifest,
|
|
@@ -1001,7 +1001,7 @@ program.command("publish").description("Auto-detect cwd and publish (apps publis
|
|
|
1001
1001
|
console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
|
|
1002
1002
|
process.exit(2);
|
|
1003
1003
|
}
|
|
1004
|
-
const { runTopLevelPublish } = await import("./publish-
|
|
1004
|
+
const { runTopLevelPublish } = await import("./publish-B67_cXdw.js");
|
|
1005
1005
|
process.exit(await runTopLevelPublish({
|
|
1006
1006
|
cwd: opts.cwd,
|
|
1007
1007
|
bump: opts.bump,
|
|
@@ -61,8 +61,8 @@ async function runDev(opts) {
|
|
|
61
61
|
}
|
|
62
62
|
process.env.ANNA_APP_RUNTIME_WEB_MODE = "real";
|
|
63
63
|
}
|
|
64
|
-
const { PythonBridge, PINNED_RUNTIME_VERSION } = await import("./bridge-
|
|
65
|
-
const { HarnessServer } = await import("./server-
|
|
64
|
+
const { PythonBridge, PINNED_RUNTIME_VERSION } = await import("./bridge-C50uFYgg.js");
|
|
65
|
+
const { HarnessServer } = await import("./server-Bzp3R6EX.js");
|
|
66
66
|
const bridge = new PythonBridge({
|
|
67
67
|
mode,
|
|
68
68
|
matrixNexusRoot: matrixNexusRoot ?? void 0,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { findMatrixNexusRoot, nexusSchemaDir } from "./nexus-root-BlPwOusj.js";
|
|
2
|
-
import { PINNED_RUNTIME_VERSION } from "./bridge-
|
|
2
|
+
import { PINNED_RUNTIME_VERSION } from "./bridge-CI8SVwa1.js";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { existsSync, statSync } from "node:fs";
|
|
5
5
|
import { spawnSync } from "node:child_process";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./nexus-root-BlPwOusj.js";
|
|
2
|
-
import { parseExecutaSpec } from "./dev-
|
|
2
|
+
import { parseExecutaSpec } from "./dev-CpKjkENF.js";
|
|
3
3
|
import { isAbsolute, resolve } from "node:path";
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { bold, cyan, dim, green, red, yellow } from "kleur/colors";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
|
|
2
|
-
import { parseExecutaSpec } from "./dev-
|
|
2
|
+
import { parseExecutaSpec } from "./dev-CpKjkENF.js";
|
|
3
3
|
import { isAbsolute, join, resolve } from "node:path";
|
|
4
4
|
import { chmodSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { bold, cyan, dim, green, red, yellow } from "kleur/colors";
|
|
@@ -25,6 +25,28 @@ function isRemoteAsset(src) {
|
|
|
25
25
|
return /^https?:\/\//i.test(src) || src.startsWith("data:");
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
+
* Server-side listing field limits, mirrored from matrix-nexus
|
|
29
|
+
* `src/schemas/anna_app.py` (`AnnaAppUpdate`). Checked locally so an
|
|
30
|
+
* over-limit value fails with an actionable message instead of surfacing
|
|
31
|
+
* as an opaque 422 that silently aborts the whole (best-effort) metadata
|
|
32
|
+
* sync on `apps push` (forum #193 demo: 175-char tagline).
|
|
33
|
+
*/
|
|
34
|
+
const LISTING_META_LIMITS = {
|
|
35
|
+
name: 120,
|
|
36
|
+
category: 60,
|
|
37
|
+
tagline: 160,
|
|
38
|
+
description: 2e4,
|
|
39
|
+
cover_url: 500,
|
|
40
|
+
homepage_url: 500,
|
|
41
|
+
support_url: 500,
|
|
42
|
+
privacy_url: 500,
|
|
43
|
+
pricing_model: 20
|
|
44
|
+
};
|
|
45
|
+
function checkListingLimit(key, value) {
|
|
46
|
+
const max = LISTING_META_LIMITS[key];
|
|
47
|
+
if (max !== void 0 && typeof value === "string" && value.length > max) throw new CliError(`manifest \`${key}\` is ${value.length} characters — the store limit is ${max}; shorten it and re-run`, 4);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
28
50
|
* Build the metadata payload from the manifest (only defined fields). The
|
|
29
51
|
* logo is handled separately and never appears here when sourced from a file.
|
|
30
52
|
*
|
|
@@ -37,9 +59,11 @@ function isRemoteAsset(src) {
|
|
|
37
59
|
function buildMeta(manifest) {
|
|
38
60
|
const meta = {};
|
|
39
61
|
const add = (key, value) => {
|
|
62
|
+
checkListingLimit(key, value);
|
|
40
63
|
if (value !== void 0 && value !== null && value !== "") meta[key] = value;
|
|
41
64
|
};
|
|
42
65
|
const addClearable = (key, value) => {
|
|
66
|
+
checkListingLimit(key, value);
|
|
43
67
|
if (value !== void 0) meta[key] = value;
|
|
44
68
|
};
|
|
45
69
|
add("name", manifest.name);
|
|
@@ -10,9 +10,9 @@ import { runExecutaPublish } from "./executa-publish-DueD_0hh.js";
|
|
|
10
10
|
import "./binary-upload-CKMU5Rfw.js";
|
|
11
11
|
import "./executa-upload-binaries-DURJTXRI.js";
|
|
12
12
|
import "./app-cache-Cr3tKbux.js";
|
|
13
|
-
import "./listing-meta-
|
|
14
|
-
import "./app-bundle-upload-
|
|
15
|
-
import { runAppsPublish } from "./apps-publish-
|
|
13
|
+
import "./listing-meta-CSopUol3.js";
|
|
14
|
+
import "./app-bundle-upload-DgoZIhQG.js";
|
|
15
|
+
import { runAppsPublish } from "./apps-publish-CqN0w8sw.js";
|
|
16
16
|
import { resolve } from "node:path";
|
|
17
17
|
import { existsSync } from "node:fs";
|
|
18
18
|
import { red, yellow } from "kleur/colors";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { canonicalHost, getAccount } from "./credentials-BTv2IfUZ.js";
|
|
2
|
-
import { BridgeRequestError } from "./bridge-
|
|
2
|
+
import { BridgeRequestError } from "./bridge-CI8SVwa1.js";
|
|
3
3
|
import { dirname, join, normalize, resolve } from "node:path";
|
|
4
4
|
import { createRequire } from "node:module";
|
|
5
5
|
import { createReadStream, existsSync, readFileSync, statSync, watch } from "node:fs";
|
|
@@ -4,7 +4,7 @@ import { CliError } from "./client-D-_z1ALk.js";
|
|
|
4
4
|
import { parseExecutaIdOverrides, readExecutasLock, substituteBundledRefs, validateBundledHandles, writeBundleToolIdSidecar, writeExecutasLock } from "./bundled-executas-rSIkaA6-.js";
|
|
5
5
|
import { loadExecutaManifest } from "./manifest-CAF3_r1T.js";
|
|
6
6
|
import { runExecutaPublish } from "./executa-publish-DueD_0hh.js";
|
|
7
|
-
import { runExecutaInstall } from "./executa-install-
|
|
7
|
+
import { runExecutaInstall } from "./executa-install-47WBVYen.js";
|
|
8
8
|
import { appCacheMatches, readAppIdentity, writeAppIdentity } from "./app-cache-Cr3tKbux.js";
|
|
9
9
|
import { join, resolve } from "node:path";
|
|
10
10
|
import { dim, green, yellow } from "kleur/colors";
|
package/package.json
CHANGED
package/dist/bridge-CL8HLo-I.js
DELETED
package/dist/dev-C0sHLKn_.js
DELETED