@anna-ai/cli 0.1.46 → 0.1.49

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 (38) hide show
  1. package/dist/{account-BBMYzSH7.js → account-CPnwqXeh.js} +1 -1
  2. package/dist/{app-bundle-upload-BNBH9x6a.js → app-bundle-upload-Ca0r-kPy.js} +2 -2
  3. package/dist/{apps-BQcbrExH.js → apps-CzqMRLbS.js} +4 -2
  4. package/dist/{apps-DlVsVHQ5.js → apps-HbfURK6y.js} +8 -1
  5. package/dist/{apps-cut-BQHvzBpJ.js → apps-cut-BhTJwILv.js} +7 -7
  6. package/dist/{apps-destructive-BVjpOxNF.js → apps-destructive-PlaU93EX.js} +1 -1
  7. package/dist/{apps-discard-CFQWOr9x.js → apps-discard-CFi-GzpU.js} +7 -7
  8. package/dist/apps-grants-DqaX8UTy.js +70 -0
  9. package/dist/apps-publish-4IIbF2xr.js +17 -0
  10. package/dist/{apps-publish-DFKd-Egv.js → apps-publish-8N9x4VEM.js} +5 -5
  11. package/dist/{apps-push-Bpv100k_.js → apps-push-CnSeLwdo.js} +9 -9
  12. package/dist/{apps-release-Goi4Psmt.js → apps-release-DGQv6DDl.js} +2 -2
  13. package/dist/{apps-rename-slug-qKXdUDDn.js → apps-rename-slug-CCEU_7JJ.js} +2 -2
  14. package/dist/{apps-status-BVIL6DYc.js → apps-status-C4Cxc2DF.js} +6 -1
  15. package/dist/{apps-submit-review-BmPjkoe9.js → apps-submit-review--hZFZRJ3.js} +9 -3
  16. package/dist/{apps-sync-meta-Ch3kECAO.js → apps-sync-meta-DnFwFNl5.js} +3 -3
  17. package/dist/{apps-versions-DfapYfW-.js → apps-versions-C7NzG5Dk.js} +10 -5
  18. package/dist/cli.js +23 -23
  19. package/dist/{dev-ClCDRplP.js → dev-Bfv3WQC0.js} +2 -2
  20. package/dist/dev-CnDh2_7r.js +4 -0
  21. package/dist/{dev-app-cache-B3Wa5t6X.js → dev-app-cache-Dw2JESld.js} +9 -2
  22. package/dist/{executa-dev-CSzM-Oha.js → executa-dev-DYO87dzg.js} +2 -2
  23. package/dist/{executa-install-CM4x4doq.js → executa-install-DAposiBw.js} +1 -1
  24. package/dist/executa-install-LaAOSkY0.js +7 -0
  25. package/dist/{executa-publish-DRK9wla1.js → executa-publish-6awuH4Ma.js} +3 -3
  26. package/dist/{executa-publish-DiyLvmyl.js → executa-publish-BKnsUoZq.js} +2 -2
  27. package/dist/{executa-upload-binaries-pCHYUcie.js → executa-upload-binaries-DwWQ18Dq.js} +1 -1
  28. package/dist/{executa-upload-binaries-BRjsS5Xx.js → executa-upload-binaries-FWM2yXfB.js} +2 -2
  29. package/dist/{listing-meta-DvxLn9NY.js → listing-meta-DgweMStT.js} +2 -4
  30. package/dist/{manifest-DZyXkzg5.js → manifest-B_DjigtQ.js} +1 -2
  31. package/dist/{publish-D2c3F4GL.js → publish-D5O5JKRb.js} +7 -7
  32. package/dist/{working-orchestration-Ny4fR7gv.js → working-orchestration-CpBJLs50.js} +4 -4
  33. package/package.json +1 -1
  34. package/templates/minimal/app.json +1 -2
  35. package/dist/apps-grants-baOFOxnO.js +0 -34
  36. package/dist/apps-publish-zeKU-9TE.js +0 -17
  37. package/dist/dev-C251jRh2.js +0 -4
  38. package/dist/executa-install-V5fSZRdO.js +0 -7
@@ -1,5 +1,5 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { setDeveloperHandle } from "./apps-DlVsVHQ5.js";
2
+ import { setDeveloperHandle } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { reportError, resolveClient } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { bold, dim, green, red } from "kleur/colors";
@@ -1,6 +1,6 @@
1
- import { finalizeBundle, finalizeWorkingBundle, getBundle, initBundle, initWorkingBundle, uploadBundleFile, uploadWorkingBundleFile } from "./apps-DlVsVHQ5.js";
1
+ import { finalizeBundle, finalizeWorkingBundle, getBundle, initBundle, initWorkingBundle, uploadBundleFile, uploadWorkingBundleFile } from "./apps-HbfURK6y.js";
2
2
  import { CliError } from "./client-sMzq2PWG.js";
3
- import { canonicalize } from "./executa-publish-DiyLvmyl.js";
3
+ import { canonicalize } from "./executa-publish-BKnsUoZq.js";
4
4
  import { join, relative, sep } from "node:path";
5
5
  import { readFileSync, readdirSync, statSync } from "node:fs";
6
6
  import { createHash } from "node:crypto";
@@ -1,5 +1,5 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { listMyApps } from "./apps-DlVsVHQ5.js";
2
+ import { listMyApps } from "./apps-HbfURK6y.js";
3
3
  import "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { bold, cyan, dim, green, magenta, red, yellow } from "kleur/colors";
@@ -30,6 +30,7 @@ async function runAppsList(opts) {
30
30
  name: a.name,
31
31
  status: a.status,
32
32
  is_dev: a.is_dev ?? false,
33
+ review_candidate_version: a.review_candidate_version ?? null,
33
34
  updated_at: a.updated_at ?? null
34
35
  }))
35
36
  }, null, 2));
@@ -42,7 +43,8 @@ async function runAppsList(opts) {
42
43
  }
43
44
  for (const a of apps) {
44
45
  const dev = a.is_dev ? " " + yellow("[dev]") : "";
45
- console.log(` ${statusTag(a.status)}${dev} ${bold(a.slug)} ${dim(`(id=${a.id})`)}`);
46
+ const inReview = a.review_candidate_version ? " " + yellow(`(v${a.review_candidate_version} in review)`) : "";
47
+ console.log(` ${statusTag(a.status)}${dev} ${bold(a.slug)} ${dim(`(id=${a.id})`)}${inReview}`);
46
48
  if (a.name && a.name !== a.slug) console.log(` ${dim(a.name)}`);
47
49
  }
48
50
  return 0;
@@ -133,6 +133,13 @@ async function getAppGrants(client, appId) {
133
133
  });
134
134
  return r.status === 404 ? null : r.data;
135
135
  }
136
+ async function getAppPermissions(client, appId) {
137
+ const r = await client.request({
138
+ path: `/api/v1/apps/${appId}/permissions`,
139
+ allowStatuses: [404]
140
+ });
141
+ return r.status === 404 ? null : r.data;
142
+ }
136
143
  /**
137
144
  * Set (or rename) the caller's developer handle — the per-developer
138
145
  * namespace for `@handle/slug` public app refs.
@@ -263,4 +270,4 @@ async function finalizeWorkingBundle(client, appId, skipRemoteCheck = false) {
263
270
  }
264
271
 
265
272
  //#endregion
266
- export { archiveApp, createApp, createVersion, cutWorkingDraft, deleteApp, deleteWorkingDraft, finalizeBundle, finalizeWorkingBundle, findAppBySlug, getApp, getAppGrants, getBundle, getWorkingDraft, initBundle, initWorkingBundle, listMyApps, listVersions, patchApp, publishVersion, setDeveloperHandle, submitForReview, unarchiveApp, unpublishApp, uploadAppLogo, uploadAppScreenshot, uploadBundleFile, uploadWorkingBundleFile, upsertWorkingDraft };
273
+ export { archiveApp, createApp, createVersion, cutWorkingDraft, deleteApp, deleteWorkingDraft, finalizeBundle, finalizeWorkingBundle, findAppBySlug, getApp, getAppGrants, getAppPermissions, getBundle, getWorkingDraft, initBundle, initWorkingBundle, listMyApps, listVersions, patchApp, publishVersion, setDeveloperHandle, submitForReview, unarchiveApp, unpublishApp, uploadAppLogo, uploadAppScreenshot, uploadBundleFile, uploadWorkingBundleFile, upsertWorkingDraft };
@@ -1,19 +1,19 @@
1
1
  import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
2
  import "./nexus-root-BlPwOusj.js";
3
- import { cutWorkingDraft } from "./apps-DlVsVHQ5.js";
3
+ import { cutWorkingDraft } from "./apps-HbfURK6y.js";
4
4
  import { CliError } from "./client-sMzq2PWG.js";
5
5
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
6
6
  import { readExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
7
7
  import { readExecutasLock, writeExecutasLock } from "./bundled-executas-BRyQkI9u.js";
8
- import { loadAppManifest, loadExecutaManifest } from "./manifest-DZyXkzg5.js";
8
+ import { loadAppManifest, loadExecutaManifest } from "./manifest-B_DjigtQ.js";
9
9
  import "./executas-CvQY_w2U.js";
10
- import "./executa-publish-DiyLvmyl.js";
10
+ import "./executa-publish-BKnsUoZq.js";
11
11
  import "./binary-upload-DVhQ0uY0.js";
12
- import { uploadExecutaBinaries } from "./executa-upload-binaries-pCHYUcie.js";
13
- import "./dev-ClCDRplP.js";
14
- import "./executa-install-CM4x4doq.js";
12
+ import { uploadExecutaBinaries } from "./executa-upload-binaries-DwWQ18Dq.js";
13
+ import "./dev-Bfv3WQC0.js";
14
+ import "./executa-install-DAposiBw.js";
15
15
  import "./app-cache-Cr3tKbux.js";
16
- import { resolveAppBySlugOrCache } from "./working-orchestration-Ny4fR7gv.js";
16
+ import { resolveAppBySlugOrCache } from "./working-orchestration-CpBJLs50.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";
@@ -1,5 +1,5 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { archiveApp, deleteApp, findAppBySlug, unarchiveApp, unpublishApp } from "./apps-DlVsVHQ5.js";
2
+ import { archiveApp, deleteApp, findAppBySlug, unarchiveApp, unpublishApp } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { ensureDestructiveAllowed } from "./confirm-ChZAVrZe.js";
@@ -1,19 +1,19 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
2
  import "./nexus-root-BlPwOusj.js";
3
- import { deleteWorkingDraft, getWorkingDraft } from "./apps-DlVsVHQ5.js";
3
+ import { deleteWorkingDraft, getWorkingDraft } from "./apps-HbfURK6y.js";
4
4
  import "./client-sMzq2PWG.js";
5
5
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
6
6
  import "./executa-cache-BFoUtb4J.js";
7
7
  import "./bundled-executas-BRyQkI9u.js";
8
- import "./manifest-DZyXkzg5.js";
8
+ import "./manifest-B_DjigtQ.js";
9
9
  import "./executas-CvQY_w2U.js";
10
- import "./executa-publish-DiyLvmyl.js";
10
+ import "./executa-publish-BKnsUoZq.js";
11
11
  import "./binary-upload-DVhQ0uY0.js";
12
- import "./executa-upload-binaries-pCHYUcie.js";
13
- import "./dev-ClCDRplP.js";
14
- import "./executa-install-CM4x4doq.js";
12
+ import "./executa-upload-binaries-DwWQ18Dq.js";
13
+ import "./dev-Bfv3WQC0.js";
14
+ import "./executa-install-DAposiBw.js";
15
15
  import "./app-cache-Cr3tKbux.js";
16
- import { resolveAppBySlugOrCache } from "./working-orchestration-Ny4fR7gv.js";
16
+ import { resolveAppBySlugOrCache } from "./working-orchestration-CpBJLs50.js";
17
17
  import { dim, green, yellow } from "kleur/colors";
18
18
 
19
19
  //#region src/commands/apps-discard.ts
@@ -0,0 +1,70 @@
1
+ import "./credentials-BTv2IfUZ.js";
2
+ import { findAppBySlug, getAppGrants, getAppPermissions } from "./apps-HbfURK6y.js";
3
+ import { CliError } from "./client-sMzq2PWG.js";
4
+ import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
+ import { bold, cyan, dim, yellow } from "kleur/colors";
6
+
7
+ //#region src/commands/apps-grants.ts
8
+ /** Pick the `*_grant` sections off a bundled executa's custom_config. */
9
+ function executaGrantSections(ex) {
10
+ const cfg = ex.custom_config;
11
+ if (!cfg || typeof cfg !== "object") return {};
12
+ const out = {};
13
+ for (const [k, v] of Object.entries(cfg)) if (k.endsWith("_grant")) out[k] = v;
14
+ return out;
15
+ }
16
+ async function runAppsGrants(opts) {
17
+ return withErrorHandling(async () => {
18
+ const { client, host } = resolveClient({ account: opts.account });
19
+ const app = await findAppBySlug(client, opts.slug);
20
+ if (!app) throw new CliError(`no app with slug "${opts.slug}" on ${host}`, 5);
21
+ const perms = await getAppPermissions(client, app.id);
22
+ const grants = perms?.app ?? await getAppGrants(client, app.id);
23
+ if (opts.json) {
24
+ console.log(JSON.stringify({
25
+ host,
26
+ app_id: app.id,
27
+ slug: app.slug,
28
+ grants,
29
+ ...perms ? {
30
+ executa_grants: (perms.executas ?? []).map((ex) => ({
31
+ name: ex.name,
32
+ executa_id: ex.executa_id,
33
+ is_enabled: ex.is_enabled,
34
+ ...executaGrantSections(ex)
35
+ })),
36
+ satisfied: perms.satisfied ?? true,
37
+ missing: perms.missing ?? []
38
+ } : {}
39
+ }, null, 2));
40
+ return 0;
41
+ }
42
+ console.log(bold(cyan(`apps/${app.slug}`)) + " " + dim(`grants`));
43
+ if (!grants) {
44
+ console.log(dim(" (no grants endpoint data available)"));
45
+ return 0;
46
+ }
47
+ console.log(JSON.stringify(grants, null, 2));
48
+ if (perms) {
49
+ const executas = perms.executas ?? [];
50
+ if (executas.length > 0) {
51
+ console.log(bold(cyan("bundled executa grants")));
52
+ for (const ex of executas) {
53
+ console.log(` ${String(ex.name ?? ex.executa_id)}:`);
54
+ const sections = executaGrantSections(ex);
55
+ if (Object.keys(sections).length === 0) console.log(dim(" (no grants configured)"));
56
+ else for (const [k, v] of Object.entries(sections)) console.log(` ${k}: ${JSON.stringify(v)}`);
57
+ }
58
+ }
59
+ const missing = perms.missing ?? [];
60
+ if (missing.length > 0) {
61
+ console.log(yellow("! missing grants (enable in the Anna dashboard permissions modal):"));
62
+ for (const m of missing) console.log(yellow(` - ${m}`));
63
+ }
64
+ }
65
+ return 0;
66
+ });
67
+ }
68
+
69
+ //#endregion
70
+ export { runAppsGrants };
@@ -0,0 +1,17 @@
1
+ import "./credentials-BTv2IfUZ.js";
2
+ import "./apps-HbfURK6y.js";
3
+ import "./client-sMzq2PWG.js";
4
+ import "./_lifecycle-shared-_9BzQ9Y2.js";
5
+ import "./executa-cache-BFoUtb4J.js";
6
+ import "./bundled-executas-BRyQkI9u.js";
7
+ import "./manifest-B_DjigtQ.js";
8
+ import "./executas-CvQY_w2U.js";
9
+ import "./executa-publish-BKnsUoZq.js";
10
+ import "./binary-upload-DVhQ0uY0.js";
11
+ import "./executa-upload-binaries-DwWQ18Dq.js";
12
+ import "./app-cache-Cr3tKbux.js";
13
+ import "./listing-meta-DgweMStT.js";
14
+ import "./app-bundle-upload-Ca0r-kPy.js";
15
+ import { runAppsPublish } from "./apps-publish-8N9x4VEM.js";
16
+
17
+ export { runAppsPublish };
@@ -1,13 +1,13 @@
1
1
  import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
- import { createApp, createVersion, findAppBySlug, getApp } from "./apps-DlVsVHQ5.js";
2
+ import { createApp, createVersion, findAppBySlug, getApp } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { parseExecutaIdOverrides, readExecutasLock, substituteBundledRefs, validateBundledHandles, writeBundleToolIdSidecar, writeExecutasLock } from "./bundled-executas-BRyQkI9u.js";
6
- import { loadAppManifest } from "./manifest-DZyXkzg5.js";
7
- import { bumpVersion, bundleHash, manifestHash, rewriteVersion, runExecutaPublish } from "./executa-publish-DiyLvmyl.js";
6
+ import { loadAppManifest } from "./manifest-B_DjigtQ.js";
7
+ import { bumpVersion, bundleHash, manifestHash, rewriteVersion, runExecutaPublish } from "./executa-publish-BKnsUoZq.js";
8
8
  import { appCacheMatches, readAppIdentity, writeAppIdentity } from "./app-cache-Cr3tKbux.js";
9
- import { syncAppListingMeta } from "./listing-meta-DvxLn9NY.js";
10
- import { isExistingDir, uploadAppBundle } from "./app-bundle-upload-BNBH9x6a.js";
9
+ import { syncAppListingMeta } from "./listing-meta-DgweMStT.js";
10
+ import { isExistingDir, uploadAppBundle } from "./app-bundle-upload-Ca0r-kPy.js";
11
11
  import { resolve } from "node:path";
12
12
  import { bold, cyan, dim, green, yellow } from "kleur/colors";
13
13
 
@@ -1,21 +1,21 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
2
  import "./nexus-root-BlPwOusj.js";
3
- import { getApp, getWorkingDraft, upsertWorkingDraft } from "./apps-DlVsVHQ5.js";
3
+ import { getApp, getWorkingDraft, upsertWorkingDraft } from "./apps-HbfURK6y.js";
4
4
  import { CliError } from "./client-sMzq2PWG.js";
5
5
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
6
6
  import "./executa-cache-BFoUtb4J.js";
7
7
  import "./bundled-executas-BRyQkI9u.js";
8
- import { loadAppManifest } from "./manifest-DZyXkzg5.js";
8
+ import { loadAppManifest } from "./manifest-B_DjigtQ.js";
9
9
  import "./executas-CvQY_w2U.js";
10
- import { bumpVersion, bundleHash, manifestHash, rewriteVersion } from "./executa-publish-DiyLvmyl.js";
10
+ import { bumpVersion, bundleHash, manifestHash, rewriteVersion } from "./executa-publish-BKnsUoZq.js";
11
11
  import "./binary-upload-DVhQ0uY0.js";
12
- import "./executa-upload-binaries-pCHYUcie.js";
13
- import "./dev-ClCDRplP.js";
14
- import "./executa-install-CM4x4doq.js";
12
+ import "./executa-upload-binaries-DwWQ18Dq.js";
13
+ import "./dev-Bfv3WQC0.js";
14
+ import "./executa-install-DAposiBw.js";
15
15
  import "./app-cache-Cr3tKbux.js";
16
- import { installLocalBundledShims, resolveAppIdentity, resolveBundledExecutas } from "./working-orchestration-Ny4fR7gv.js";
17
- import { syncAppListingMeta } from "./listing-meta-DvxLn9NY.js";
18
- import { isExistingDir, uploadWorkingBundle } from "./app-bundle-upload-BNBH9x6a.js";
16
+ import { installLocalBundledShims, resolveAppIdentity, resolveBundledExecutas } from "./working-orchestration-CpBJLs50.js";
17
+ import { syncAppListingMeta } from "./listing-meta-DgweMStT.js";
18
+ import { isExistingDir, uploadWorkingBundle } from "./app-bundle-upload-Ca0r-kPy.js";
19
19
  import { resolve } from "node:path";
20
20
  import { bold, cyan, dim, green, yellow } from "kleur/colors";
21
21
 
@@ -1,5 +1,5 @@
1
1
  import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, getApp, getBundle, listVersions, publishVersion } from "./apps-DlVsVHQ5.js";
2
+ import { findAppBySlug, getApp, getBundle, listVersions, publishVersion } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { readAppIdentity } from "./app-cache-Cr3tKbux.js";
@@ -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-zeKU-9TE.js");
62
+ const { runAppsPublish } = await import("./apps-publish-4IIbF2xr.js");
63
63
  const code = await runAppsPublish({
64
64
  cwd: opts.cwd,
65
65
  account: opts.account,
@@ -1,8 +1,8 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, patchApp } from "./apps-DlVsVHQ5.js";
2
+ import { findAppBySlug, patchApp } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { reportError, resolveClient } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
- import { loadAppManifest } from "./manifest-DZyXkzg5.js";
5
+ import { loadAppManifest } from "./manifest-B_DjigtQ.js";
6
6
  import { readAppIdentity, writeAppIdentity } from "./app-cache-Cr3tKbux.js";
7
7
  import { writeFileSync } from "node:fs";
8
8
  import { bold, dim, green, red, yellow } from "kleur/colors";
@@ -1,5 +1,5 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, getApp, listVersions } from "./apps-DlVsVHQ5.js";
2
+ import { findAppBySlug, getApp, listVersions } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { bold, cyan, dim, green, red, yellow } from "kleur/colors";
@@ -23,6 +23,7 @@ async function runAppsStatus(opts) {
23
23
  visibility: full.visibility ?? null,
24
24
  is_published: full.is_published ?? false,
25
25
  review_message: full.review_message ?? null,
26
+ review_candidate_version: full.review_candidate_version ?? null,
26
27
  latest_version: latest ? {
27
28
  id: latest.id,
28
29
  version: latest.version,
@@ -39,6 +40,10 @@ async function runAppsStatus(opts) {
39
40
  console.log(` ${dim("status :")} ${colorStatus(full.status)}` + (full.is_published ? " " + green("[published]") : ""));
40
41
  if (latest) console.log(` ${dim("latest :")} v${latest.version} (id=${latest.id}, published=${latest.published_at ?? "—"})`);
41
42
  else console.log(` ${dim("latest :")} ${dim("(no versions yet)")}`);
43
+ if (full.review_candidate_version) {
44
+ const isReleaseReview = (full.status || "").toUpperCase() === "PUBLISHED";
45
+ console.log(` ${dim("in review :")} ${yellow(`v${full.review_candidate_version}`)} ${dim(isReleaseReview ? "(release under review — awaiting admin approval)" : "(pinned at submit-review)")}`);
46
+ }
42
47
  if (full.review_message) console.log(` ${dim("reviewer :")} ${full.review_message}`);
43
48
  console.log(` ${dim("versions :")} ${versions.length} total`);
44
49
  return 0;
@@ -1,10 +1,10 @@
1
1
  import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, getApp, submitForReview } from "./apps-DlVsVHQ5.js";
2
+ import { findAppBySlug, getApp, submitForReview } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import { readAppIdentity } from "./app-cache-Cr3tKbux.js";
6
6
  import { resolve } from "node:path";
7
- import { bold, cyan, green } from "kleur/colors";
7
+ import { bold, cyan, dim, green } from "kleur/colors";
8
8
 
9
9
  //#region src/commands/apps-submit-review.ts
10
10
  async function runAppsSubmitReview(opts) {
@@ -26,17 +26,23 @@ async function runAppsSubmitReview(opts) {
26
26
  }
27
27
  const app = await submitForReview(client, appId);
28
28
  const finalApp = await getApp(client, appId);
29
+ const candidate = app.review_candidate_version ?? finalApp.review_candidate_version ?? null;
29
30
  if (opts.json) {
30
31
  console.log(JSON.stringify({
31
32
  host,
32
33
  app_id: appId,
33
34
  slug: serverSlug,
34
- status: finalApp.status
35
+ status: finalApp.status,
36
+ review_candidate_version: candidate
35
37
  }, null, 2));
36
38
  return 0;
37
39
  }
38
40
  console.log(green(`✓ apps/${serverSlug}: submitted for review`));
39
41
  console.log(bold(cyan(`status: ${app.status ?? finalApp.status}`)));
42
+ if (candidate) {
43
+ console.log(`under review: ${bold(`v${candidate}`)}`);
44
+ console.log(dim("versions cut after this point are NOT part of this review round — re-run `apps submit-review` to re-pin to the newest cut"));
45
+ }
40
46
  return 0;
41
47
  });
42
48
  }
@@ -1,10 +1,10 @@
1
1
  import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, getApp } from "./apps-DlVsVHQ5.js";
2
+ import { findAppBySlug, getApp } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
- import { loadAppManifest } from "./manifest-DZyXkzg5.js";
5
+ import { loadAppManifest } from "./manifest-B_DjigtQ.js";
6
6
  import { readAppIdentity } from "./app-cache-Cr3tKbux.js";
7
- import { syncAppListingMeta } from "./listing-meta-DvxLn9NY.js";
7
+ import { syncAppListingMeta } from "./listing-meta-DgweMStT.js";
8
8
  import { resolve } from "node:path";
9
9
  import { bold, cyan, dim, green } from "kleur/colors";
10
10
 
@@ -1,8 +1,8 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, listVersions } from "./apps-DlVsVHQ5.js";
2
+ import { findAppBySlug, listVersions } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
- import { bold, cyan, dim, green } from "kleur/colors";
5
+ import { bold, cyan, dim, green, red, yellow } from "kleur/colors";
6
6
 
7
7
  //#region src/commands/apps-versions.ts
8
8
  async function runAppsVersions(opts) {
@@ -16,12 +16,14 @@ async function runAppsVersions(opts) {
16
16
  host,
17
17
  app_id: app.id,
18
18
  slug: app.slug,
19
+ review_candidate_version: app.review_candidate_version ?? null,
19
20
  versions: versions.map((v) => ({
20
21
  id: v.id,
21
22
  version: v.version,
22
23
  is_latest: v.is_latest ?? false,
23
24
  published_at: v.published_at ?? null,
24
- created_at: v.created_at ?? null
25
+ created_at: v.created_at ?? null,
26
+ release_review_state: v.release_review_state ?? null
25
27
  }))
26
28
  }, null, 2));
27
29
  return 0;
@@ -32,9 +34,12 @@ async function runAppsVersions(opts) {
32
34
  return 0;
33
35
  }
34
36
  for (const v of versions) {
35
- const tag = v.is_latest ? green("[latest]") : dim(" ");
36
- console.log(` ${tag} v${v.version} ${dim(`(id=${v.id}, published=${v.published_at ?? ""})`)}`);
37
+ const inReview = v.version === app.review_candidate_version;
38
+ const tag = v.is_latest ? green("[latest]") : inReview ? yellow("[review]") : dim(" ");
39
+ const rereview = v.release_review_state === "pending" ? " " + yellow("(re-review pending)") : v.release_review_state === "rejected" ? " " + red("(re-review rejected)") : "";
40
+ console.log(` ${tag} v${v.version} ${dim(`(id=${v.id}, published=${v.published_at ?? "—"})`)}${rereview}`);
37
41
  }
42
+ if (app.status.toUpperCase() === "PUBLISHED" && !versions.some((v) => v.is_latest)) console.log(yellow(" ! app is PUBLISHED but no version is released — ") + yellow("new installs will fail; run `anna-app apps release <version>`"));
38
43
  return 0;
39
44
  });
40
45
  }
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-C251jRh2.js");
477
+ const { runDev, parseExecutaSpec } = await import("./dev-CnDh2_7r.js");
478
478
  const cwd = opts.cwd ?? process.cwd();
479
479
  let executas;
480
480
  if (opts.executa && opts.executa.length > 0) {
@@ -561,7 +561,7 @@ program.command("whoami").description("Show the current account (and any others)
561
561
  });
562
562
  const account = program.command("account").description("Manage your developer account (handle / namespace)");
563
563
  account.command("set-handle <handle>").description("Set or rename your developer handle — the @handle namespace your apps publish under (@handle/slug). Required before creating your first app.").option("--host <url>", "Account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (handle, opts) => {
564
- const { runAccountSetHandle } = await import("./account-BBMYzSH7.js");
564
+ const { runAccountSetHandle } = await import("./account-CPnwqXeh.js");
565
565
  const code = await runAccountSetHandle({
566
566
  handle,
567
567
  account: opts.host,
@@ -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-V5fSZRdO.js");
600
+ const { runExecutaInstall } = await import("./executa-install-LaAOSkY0.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-CSzM-Oha.js");
611
+ const { runExecutaDev } = await import("./executa-dev-DYO87dzg.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;
@@ -646,14 +646,14 @@ executa.command("dev").description("Run one Executa plugin in isolation (REPL or
646
646
  });
647
647
  const apps = program.command("apps").description("Anna App publish lifecycle commands");
648
648
  apps.command("list").description("List the Anna Apps you authored, with lifecycle status").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
649
- const { runAppsList } = await import("./apps-BQcbrExH.js");
649
+ const { runAppsList } = await import("./apps-CzqMRLbS.js");
650
650
  process.exit(await runAppsList({
651
651
  account: opts.account,
652
652
  json: opts.json
653
653
  }));
654
654
  });
655
655
  apps.command("rename-slug <new-slug>").description("Rename an app's public slug (DRAFT/REJECTED, never-published, zero installs only). Updates local app.json + .anna/app.json on success.").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (newSlug, opts) => {
656
- const { runAppsRenameSlug } = await import("./apps-rename-slug-qKXdUDDn.js");
656
+ const { runAppsRenameSlug } = await import("./apps-rename-slug-CCEU_7JJ.js");
657
657
  process.exit(await runAppsRenameSlug({
658
658
  newSlug,
659
659
  cwd: opts.cwd,
@@ -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-zeKU-9TE.js");
674
+ const { runAppsPublish } = await import("./apps-publish-4IIbF2xr.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-Bpv100k_.js");
708
+ const { runAppsPush } = await import("./apps-push-CnSeLwdo.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-BQHvzBpJ.js");
728
+ const { runAppsCut } = await import("./apps-cut-BhTJwILv.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-CFQWOr9x.js");
740
+ const { runAppsDiscard } = await import("./apps-discard-CFi-GzpU.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-Goi4Psmt.js");
750
+ const { runAppsRelease } = await import("./apps-release-DGQv6DDl.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-Ch3kECAO.js");
762
+ const { runAppsSyncMeta } = await import("./apps-sync-meta-DnFwFNl5.js");
763
763
  process.exit(await runAppsSyncMeta({
764
764
  cwd: opts.cwd,
765
765
  manifest: opts.manifest,
@@ -770,7 +770,7 @@ apps.command("sync-meta").description("Push mutable store metadata (name/tagline
770
770
  }));
771
771
  });
772
772
  apps.command("submit-review [slug]").description("Move an app into review (DRAFT/REJECTED → PENDING_REVIEW)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
773
- const { runAppsSubmitReview } = await import("./apps-submit-review-BmPjkoe9.js");
773
+ const { runAppsSubmitReview } = await import("./apps-submit-review--hZFZRJ3.js");
774
774
  process.exit(await runAppsSubmitReview({
775
775
  slug,
776
776
  cwd: opts.cwd,
@@ -779,7 +779,7 @@ apps.command("submit-review [slug]").description("Move an app into review (DRAFT
779
779
  }));
780
780
  });
781
781
  apps.command("status <slug>").description("Show server-known state for one Anna App").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
782
- const { runAppsStatus } = await import("./apps-status-BVIL6DYc.js");
782
+ const { runAppsStatus } = await import("./apps-status-C4Cxc2DF.js");
783
783
  process.exit(await runAppsStatus({
784
784
  slug,
785
785
  account: opts.account,
@@ -787,7 +787,7 @@ apps.command("status <slug>").description("Show server-known state for one Anna
787
787
  }));
788
788
  });
789
789
  apps.command("versions <slug>").description("List all server versions of one Anna App").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
790
- const { runAppsVersions } = await import("./apps-versions-DfapYfW-.js");
790
+ const { runAppsVersions } = await import("./apps-versions-C7NzG5Dk.js");
791
791
  process.exit(await runAppsVersions({
792
792
  slug,
793
793
  account: opts.account,
@@ -795,7 +795,7 @@ apps.command("versions <slug>").description("List all server versions of one Ann
795
795
  }));
796
796
  });
797
797
  apps.command("grants <slug>").description("Show currently granted scopes/quota for one Anna App").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
798
- const { runAppsGrants } = await import("./apps-grants-baOFOxnO.js");
798
+ const { runAppsGrants } = await import("./apps-grants-DqaX8UTy.js");
799
799
  process.exit(await runAppsGrants({
800
800
  slug,
801
801
  account: opts.account,
@@ -803,7 +803,7 @@ apps.command("grants <slug>").description("Show currently granted scopes/quota f
803
803
  }));
804
804
  });
805
805
  apps.command("unpublish <slug>").description("Flip a PUBLISHED app back to APPROVED (private)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
806
- const { runAppsUnpublish } = await import("./apps-destructive-BVjpOxNF.js");
806
+ const { runAppsUnpublish } = await import("./apps-destructive-PlaU93EX.js");
807
807
  process.exit(await runAppsUnpublish({
808
808
  slug,
809
809
  yes: opts.yes,
@@ -813,7 +813,7 @@ apps.command("unpublish <slug>").description("Flip a PUBLISHED app back to APPRO
813
813
  }));
814
814
  });
815
815
  apps.command("archive <slug>").description("Archive an Anna App (hides it from end users)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
816
- const { runAppsArchive } = await import("./apps-destructive-BVjpOxNF.js");
816
+ const { runAppsArchive } = await import("./apps-destructive-PlaU93EX.js");
817
817
  process.exit(await runAppsArchive({
818
818
  slug,
819
819
  yes: opts.yes,
@@ -823,7 +823,7 @@ apps.command("archive <slug>").description("Archive an Anna App (hides it from e
823
823
  }));
824
824
  });
825
825
  apps.command("unarchive <slug>").description("Restore an archived Anna App back to APPROVED").option("--yes", "Acknowledge the operation", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
826
- const { runAppsUnarchive } = await import("./apps-destructive-BVjpOxNF.js");
826
+ const { runAppsUnarchive } = await import("./apps-destructive-PlaU93EX.js");
827
827
  process.exit(await runAppsUnarchive({
828
828
  slug,
829
829
  yes: opts.yes,
@@ -832,7 +832,7 @@ apps.command("unarchive <slug>").description("Restore an archived Anna App back
832
832
  }));
833
833
  });
834
834
  apps.command("delete <slug>").description("Hard-delete an Anna App (refused by server if installs exist)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
835
- const { runAppsDelete } = await import("./apps-destructive-BVjpOxNF.js");
835
+ const { runAppsDelete } = await import("./apps-destructive-PlaU93EX.js");
836
836
  process.exit(await runAppsDelete({
837
837
  slug,
838
838
  yes: opts.yes,
@@ -873,7 +873,7 @@ executa.command("publish").description("Mint or update an Executa (executa.json
873
873
  console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
874
874
  process.exit(2);
875
875
  }
876
- const { runExecutaPublish } = await import("./executa-publish-DRK9wla1.js");
876
+ const { runExecutaPublish } = await import("./executa-publish-6awuH4Ma.js");
877
877
  process.exit(await runExecutaPublish({
878
878
  cwd: opts.cwd,
879
879
  manifest: opts.manifest,
@@ -887,7 +887,7 @@ executa.command("publish").description("Mint or update an Executa (executa.json
887
887
  }));
888
888
  });
889
889
  executa.command("upload-binaries").description("Push the local binary_artifacts declared in executa.json straight to the platform CDN (no public source URL needed — works for private repos). Requires a minted identity (.anna/executa.json from `executa publish` / `apps push`) or --tool-id.").option("--dir <path>", "Executa project dir (default: CWD)").option("--dry-run", "Hash artifacts + validate the plan server-side without uploading", false).option("--oidc", "Mint the upload token from the GitHub Actions OIDC id-token instead of a PAT (zero long-term secrets; needs `permissions: id-token: write` and a registered trusted publisher)", false).option("--tool-id <id>", "Explicit tool_id (skip the identity cache)").option("--host <url>", "Nexus host (required with --oidc unless ANNA_APP_HOST is set)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
890
- const { runExecutaUploadBinaries } = await import("./executa-upload-binaries-BRjsS5Xx.js");
890
+ const { runExecutaUploadBinaries } = await import("./executa-upload-binaries-FWM2yXfB.js");
891
891
  process.exit(await runExecutaUploadBinaries({
892
892
  dir: opts.dir,
893
893
  dryRun: opts.dryRun,
@@ -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-D2c3F4GL.js");
1004
+ const { runTopLevelPublish } = await import("./publish-D5O5JKRb.js");
1005
1005
  process.exit(await runTopLevelPublish({
1006
1006
  cwd: opts.cwd,
1007
1007
  bump: opts.bump,
@@ -175,7 +175,7 @@ async function runDev(opts) {
175
175
  */
176
176
  async function resolveRealLlm(args) {
177
177
  const { getAccount } = await import("./credentials-Chkoidh5.js");
178
- const { ensureDevAppRegistered } = await import("./dev-app-cache-B3Wa5t6X.js");
178
+ const { ensureDevAppRegistered } = await import("./dev-app-cache-Dw2JESld.js");
179
179
  const acc = getAccount(args.account);
180
180
  if (!acc) {
181
181
  console.error(red("✗ no developer PAT on disk — run `anna-app login --host <nexus-url>` first.\n (or use `--no-llm` / `--mock-llm <fixture>` to develop offline.)"));
@@ -204,7 +204,7 @@ async function resolveRealLlm(args) {
204
204
  account: args.account,
205
205
  appSlug: entry.slug,
206
206
  onAppSlugNotFound: async () => {
207
- const { invalidateDevAppCache } = await import("./dev-app-cache-B3Wa5t6X.js");
207
+ const { invalidateDevAppCache } = await import("./dev-app-cache-Dw2JESld.js");
208
208
  invalidateDevAppCache(args.cwd);
209
209
  const fresh = getAccount(args.account);
210
210
  if (!fresh) throw new Error("PAT not found while re-registering dev app — run `anna-app login` again");
@@ -0,0 +1,4 @@
1
+ import "./nexus-root-BlPwOusj.js";
2
+ import { parseExecutaSpec, runDev } from "./dev-Bfv3WQC0.js";
3
+
4
+ export { parseExecutaSpec, runDev };
@@ -16,8 +16,12 @@ const CACHE_FILE = "dev-app.json";
16
16
  * 2 — server now writes the full dev grant bundle (llm + image + upload);
17
17
  * re-register so pre-existing dev apps pick up `upload_grant` /
18
18
  * `image_grant` (fixes host/uploadFile → APP_NOT_GRANTED, forum #159)
19
+ * 3 — server widened `llm_grant.allowed_tools` from [] to the full
20
+ * sandbox tool registry (nexus 1.1.0-beta.115, forum #192); stale
21
+ * rows made every sandbox session resolve zero tools
22
+ * (granted_tools: [] + NO_TOOLS_AVAILABLE, forum #225)
19
23
  */
20
- const DEV_APP_CACHE_VERSION = 2;
24
+ const DEV_APP_CACHE_VERSION = 3;
21
25
  function cachePath(cwd) {
22
26
  return resolve(cwd, CACHE_DIR, CACHE_FILE);
23
27
  }
@@ -136,8 +140,11 @@ const EXECUTA_CACHE_FILE = "dev-executa.json";
136
140
  * 1 — initial (llm_grant only)
137
141
  * 2 — adds image_grant + upload_grant; fixes `allowedPurposes` to
138
142
  * protocol whitelist {image_input,image_reference,user_artifact}
143
+ * 3 — server widened `llm_grant.allowed_tools` from [] to the full
144
+ * sandbox tool registry (nexus 1.1.0-beta.115, forum #192); same
145
+ * staleness as DEV_APP_CACHE_VERSION 3 for the from_sampling path
139
146
  */
140
- const EXECUTA_CACHE_VERSION = 2;
147
+ const EXECUTA_CACHE_VERSION = 3;
141
148
  function executaCachePath(cwd) {
142
149
  return resolve(cwd, CACHE_DIR, EXECUTA_CACHE_FILE);
143
150
  }
@@ -1,5 +1,5 @@
1
1
  import "./nexus-root-BlPwOusj.js";
2
- import { parseExecutaSpec } from "./dev-ClCDRplP.js";
2
+ import { parseExecutaSpec } from "./dev-Bfv3WQC0.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";
@@ -35,7 +35,7 @@ async function runExecutaDev(opts) {
35
35
  const oneShot = !!(opts.describe || opts.health || opts.invoke);
36
36
  const quiet = oneShot && (opts.json ?? false);
37
37
  const { getAccount } = await import("./credentials-Chkoidh5.js");
38
- const { ensureDevExecutaRegistered } = await import("./dev-app-cache-B3Wa5t6X.js");
38
+ const { ensureDevExecutaRegistered } = await import("./dev-app-cache-Dw2JESld.js");
39
39
  const needsRealMint = !opts.noSampling && !opts.mockSampling || !opts.noAgent && !opts.mockAgent || !opts.noImage && !opts.mockImage || !opts.noUpload && !opts.mockUpload || opts.storage === "real";
40
40
  let effectiveAppSlug = opts.appSlug;
41
41
  let autoRegistered = false;
@@ -1,5 +1,5 @@
1
1
  import { readExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
2
- import { parseExecutaSpec } from "./dev-ClCDRplP.js";
2
+ import { parseExecutaSpec } from "./dev-Bfv3WQC0.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";
@@ -0,0 +1,7 @@
1
+ import "./credentials-BTv2IfUZ.js";
2
+ import "./nexus-root-BlPwOusj.js";
3
+ import "./executa-cache-BFoUtb4J.js";
4
+ import "./dev-Bfv3WQC0.js";
5
+ import { runExecutaInstall } from "./executa-install-DAposiBw.js";
6
+
7
+ export { runExecutaInstall };
@@ -2,10 +2,10 @@ import "./credentials-BTv2IfUZ.js";
2
2
  import "./client-sMzq2PWG.js";
3
3
  import "./_lifecycle-shared-_9BzQ9Y2.js";
4
4
  import "./executa-cache-BFoUtb4J.js";
5
- import "./manifest-DZyXkzg5.js";
5
+ import "./manifest-B_DjigtQ.js";
6
6
  import "./executas-CvQY_w2U.js";
7
- import { runExecutaPublish } from "./executa-publish-DiyLvmyl.js";
7
+ import { runExecutaPublish } from "./executa-publish-BKnsUoZq.js";
8
8
  import "./binary-upload-DVhQ0uY0.js";
9
- import "./executa-upload-binaries-pCHYUcie.js";
9
+ import "./executa-upload-binaries-DwWQ18Dq.js";
10
10
 
11
11
  export { runExecutaPublish };
@@ -2,9 +2,9 @@ import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
2
  import { CliError } from "./client-sMzq2PWG.js";
3
3
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
4
4
  import { executaCacheMatches, invalidateExecutaCache, mintIdempotencyKey, readExecutaIdentity, writeExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
5
- import { loadExecutaManifest } from "./manifest-DZyXkzg5.js";
5
+ import { loadExecutaManifest } from "./manifest-B_DjigtQ.js";
6
6
  import { commitDraft, createDraft, getMySkill, getMyTool, listToolVersions, publishToolVersion, setSkillVisibility, setToolVisibility, updateMySkill, updateMyTool } from "./executas-CvQY_w2U.js";
7
- import { uploadExecutaBinaries } from "./executa-upload-binaries-pCHYUcie.js";
7
+ import { uploadExecutaBinaries } from "./executa-upload-binaries-DwWQ18Dq.js";
8
8
  import { join, relative, resolve, sep } from "node:path";
9
9
  import { readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
10
10
  import { bold, cyan, dim, green, yellow } from "kleur/colors";
@@ -2,7 +2,7 @@ import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
2
  import { CliError } from "./client-sMzq2PWG.js";
3
3
  import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
4
4
  import { readExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
5
- import { loadExecutaManifest } from "./manifest-DZyXkzg5.js";
5
+ import { loadExecutaManifest } from "./manifest-B_DjigtQ.js";
6
6
  import { fetchGitHubIdToken, finalizeBinaryUpload, initBinaryUpload, mintUploadSession, mintUploadSessionViaOidc, uploadBinaryPart } from "./binary-upload-DVhQ0uY0.js";
7
7
  import { isAbsolute, resolve } from "node:path";
8
8
  import { closeSync, createReadStream, existsSync, openSync, readSync, statSync } from "node:fs";
@@ -2,8 +2,8 @@ import "./credentials-BTv2IfUZ.js";
2
2
  import "./client-sMzq2PWG.js";
3
3
  import "./_lifecycle-shared-_9BzQ9Y2.js";
4
4
  import "./executa-cache-BFoUtb4J.js";
5
- import "./manifest-DZyXkzg5.js";
5
+ import "./manifest-B_DjigtQ.js";
6
6
  import "./binary-upload-DVhQ0uY0.js";
7
- import { expandArtifactPath, resolveArtifactPlan, runExecutaUploadBinaries, uploadExecutaBinaries, uploadPlannedParts } from "./executa-upload-binaries-pCHYUcie.js";
7
+ import { expandArtifactPath, resolveArtifactPlan, runExecutaUploadBinaries, uploadExecutaBinaries, uploadPlannedParts } from "./executa-upload-binaries-DwWQ18Dq.js";
8
8
 
9
9
  export { runExecutaUploadBinaries };
@@ -1,4 +1,4 @@
1
- import { patchApp, uploadAppLogo, uploadAppScreenshot } from "./apps-DlVsVHQ5.js";
1
+ import { patchApp, uploadAppLogo, uploadAppScreenshot } from "./apps-HbfURK6y.js";
2
2
  import { CliError } from "./client-sMzq2PWG.js";
3
3
  import { extname, resolve } from "node:path";
4
4
  import { existsSync, readFileSync } from "node:fs";
@@ -39,8 +39,7 @@ const LISTING_META_LIMITS = {
39
39
  cover_url: 500,
40
40
  homepage_url: 500,
41
41
  support_url: 500,
42
- privacy_url: 500,
43
- pricing_model: 20
42
+ privacy_url: 500
44
43
  };
45
44
  function checkListingLimit(key, value) {
46
45
  const max = LISTING_META_LIMITS[key];
@@ -74,7 +73,6 @@ function buildMeta(manifest) {
74
73
  addClearable("homepage_url", manifest.homepageUrl);
75
74
  addClearable("support_url", manifest.supportUrl);
76
75
  addClearable("privacy_url", manifest.privacyUrl);
77
- add("pricing_model", manifest.pricingModel);
78
76
  return meta;
79
77
  }
80
78
  /**
@@ -78,8 +78,7 @@ function loadAppManifest(cwd, manifestPath) {
78
78
  screenshots: pickMetaArray("screenshots"),
79
79
  homepageUrl: pickClearableMeta("homepage_url"),
80
80
  supportUrl: pickClearableMeta("support_url"),
81
- privacyUrl: pickClearableMeta("privacy_url"),
82
- pricingModel: pickMeta("pricing_model")
81
+ privacyUrl: pickClearableMeta("privacy_url")
83
82
  };
84
83
  }
85
84
  const HANDLE_RE = /^[a-z0-9][a-z0-9-]{0,62}$/;
@@ -1,18 +1,18 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import "./apps-DlVsVHQ5.js";
2
+ import "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
5
  import "./executa-cache-BFoUtb4J.js";
6
6
  import "./bundled-executas-BRyQkI9u.js";
7
- import "./manifest-DZyXkzg5.js";
7
+ import "./manifest-B_DjigtQ.js";
8
8
  import "./executas-CvQY_w2U.js";
9
- import { runExecutaPublish } from "./executa-publish-DiyLvmyl.js";
9
+ import { runExecutaPublish } from "./executa-publish-BKnsUoZq.js";
10
10
  import "./binary-upload-DVhQ0uY0.js";
11
- import "./executa-upload-binaries-pCHYUcie.js";
11
+ import "./executa-upload-binaries-DwWQ18Dq.js";
12
12
  import "./app-cache-Cr3tKbux.js";
13
- import "./listing-meta-DvxLn9NY.js";
14
- import "./app-bundle-upload-BNBH9x6a.js";
15
- import { runAppsPublish } from "./apps-publish-DFKd-Egv.js";
13
+ import "./listing-meta-DgweMStT.js";
14
+ import "./app-bundle-upload-Ca0r-kPy.js";
15
+ import { runAppsPublish } from "./apps-publish-8N9x4VEM.js";
16
16
  import { resolve } from "node:path";
17
17
  import { existsSync } from "node:fs";
18
18
  import { red, yellow } from "kleur/colors";
@@ -1,10 +1,10 @@
1
1
  import { canonicalHost } from "./credentials-BTv2IfUZ.js";
2
- import { createApp, findAppBySlug, getApp } from "./apps-DlVsVHQ5.js";
2
+ import { createApp, findAppBySlug, getApp } from "./apps-HbfURK6y.js";
3
3
  import { CliError } from "./client-sMzq2PWG.js";
4
4
  import { parseExecutaIdOverrides, readExecutasLock, substituteBundledRefs, validateBundledHandles, writeBundleToolIdSidecar, writeExecutasLock } from "./bundled-executas-BRyQkI9u.js";
5
- import { loadExecutaManifest } from "./manifest-DZyXkzg5.js";
6
- import { runExecutaPublish } from "./executa-publish-DiyLvmyl.js";
7
- import { runExecutaInstall } from "./executa-install-CM4x4doq.js";
5
+ import { loadExecutaManifest } from "./manifest-B_DjigtQ.js";
6
+ import { runExecutaPublish } from "./executa-publish-BKnsUoZq.js";
7
+ import { runExecutaInstall } from "./executa-install-DAposiBw.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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anna-ai/cli",
3
- "version": "0.1.46",
3
+ "version": "0.1.49",
4
4
  "description": "Anna App developer CLI: scaffold, validate, harness (Phase 2 MVP: init + validate).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -2,6 +2,5 @@
2
2
  "name": "__SLUG__",
3
3
  "tagline": "TODO",
4
4
  "description": "TODO",
5
- "category": "productivity",
6
- "pricing_model": "free"
5
+ "category": "productivity"
7
6
  }
@@ -1,34 +0,0 @@
1
- import "./credentials-BTv2IfUZ.js";
2
- import { findAppBySlug, getAppGrants } from "./apps-DlVsVHQ5.js";
3
- import { CliError } from "./client-sMzq2PWG.js";
4
- import { resolveClient, withErrorHandling } from "./_lifecycle-shared-_9BzQ9Y2.js";
5
- import { bold, cyan, dim } from "kleur/colors";
6
-
7
- //#region src/commands/apps-grants.ts
8
- async function runAppsGrants(opts) {
9
- return withErrorHandling(async () => {
10
- const { client, host } = resolveClient({ account: opts.account });
11
- const app = await findAppBySlug(client, opts.slug);
12
- if (!app) throw new CliError(`no app with slug "${opts.slug}" on ${host}`, 5);
13
- const grants = await getAppGrants(client, app.id);
14
- if (opts.json) {
15
- console.log(JSON.stringify({
16
- host,
17
- app_id: app.id,
18
- slug: app.slug,
19
- grants
20
- }, null, 2));
21
- return 0;
22
- }
23
- console.log(bold(cyan(`apps/${app.slug}`)) + " " + dim(`grants`));
24
- if (!grants) {
25
- console.log(dim(" (no grants endpoint data available)"));
26
- return 0;
27
- }
28
- console.log(JSON.stringify(grants, null, 2));
29
- return 0;
30
- });
31
- }
32
-
33
- //#endregion
34
- export { runAppsGrants };
@@ -1,17 +0,0 @@
1
- import "./credentials-BTv2IfUZ.js";
2
- import "./apps-DlVsVHQ5.js";
3
- import "./client-sMzq2PWG.js";
4
- import "./_lifecycle-shared-_9BzQ9Y2.js";
5
- import "./executa-cache-BFoUtb4J.js";
6
- import "./bundled-executas-BRyQkI9u.js";
7
- import "./manifest-DZyXkzg5.js";
8
- import "./executas-CvQY_w2U.js";
9
- import "./executa-publish-DiyLvmyl.js";
10
- import "./binary-upload-DVhQ0uY0.js";
11
- import "./executa-upload-binaries-pCHYUcie.js";
12
- import "./app-cache-Cr3tKbux.js";
13
- import "./listing-meta-DvxLn9NY.js";
14
- import "./app-bundle-upload-BNBH9x6a.js";
15
- import { runAppsPublish } from "./apps-publish-DFKd-Egv.js";
16
-
17
- export { runAppsPublish };
@@ -1,4 +0,0 @@
1
- import "./nexus-root-BlPwOusj.js";
2
- import { parseExecutaSpec, runDev } from "./dev-ClCDRplP.js";
3
-
4
- export { parseExecutaSpec, runDev };
@@ -1,7 +0,0 @@
1
- import "./credentials-BTv2IfUZ.js";
2
- import "./nexus-root-BlPwOusj.js";
3
- import "./executa-cache-BFoUtb4J.js";
4
- import "./dev-ClCDRplP.js";
5
- import { runExecutaInstall } from "./executa-install-CM4x4doq.js";
6
-
7
- export { runExecutaInstall };