@m8t-stack/cli 0.2.27 → 0.2.28
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/README.md +8 -8
- package/dist/cli.js +136 -110
- package/dist/cli.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -931,7 +931,7 @@ var init_foundry_agents = __esm({
|
|
|
931
931
|
"use strict";
|
|
932
932
|
init_http();
|
|
933
933
|
init_errors();
|
|
934
|
-
METADATA_SOURCE = "m8t
|
|
934
|
+
METADATA_SOURCE = "m8t";
|
|
935
935
|
FOUNDRY_SCOPE2 = "https://ai.azure.com/.default";
|
|
936
936
|
API = "v1";
|
|
937
937
|
}
|
|
@@ -1177,7 +1177,7 @@ async function enableHostedBrain(args) {
|
|
|
1177
1177
|
// survive the relink version; the managed fields are re-asserted over the
|
|
1178
1178
|
// spread, and createCoderVersion applies the `brain` arg last.
|
|
1179
1179
|
...current.metadata,
|
|
1180
|
-
source: "m8t
|
|
1180
|
+
source: "m8t",
|
|
1181
1181
|
kind: "hosted",
|
|
1182
1182
|
persona: current.metadata?.persona ?? "coding-agent",
|
|
1183
1183
|
personaVersion: current.metadata?.personaVersion ?? null
|
|
@@ -1247,7 +1247,7 @@ var init_enable_hosted_brain = __esm({
|
|
|
1247
1247
|
import { Builtins, Cli } from "clipanion";
|
|
1248
1248
|
|
|
1249
1249
|
// src/lib/package-version.ts
|
|
1250
|
-
var CLI_VERSION = "0.2.
|
|
1250
|
+
var CLI_VERSION = "0.2.28";
|
|
1251
1251
|
|
|
1252
1252
|
// src/lib/render-error.ts
|
|
1253
1253
|
init_errors();
|
|
@@ -1412,7 +1412,7 @@ var BACKEND_RULES = [
|
|
|
1412
1412
|
{
|
|
1413
1413
|
code: "UPSTREAM_FAILED",
|
|
1414
1414
|
reason: "kv_secret_malformed",
|
|
1415
|
-
hint: () => "the Key Vault secret for this binding is in an unexpected shape. Manual cleanup may be required \u2014 contact your m8t
|
|
1415
|
+
hint: () => "the Key Vault secret for this binding is in an unexpected shape. Manual cleanup may be required \u2014 contact your m8t admin."
|
|
1416
1416
|
},
|
|
1417
1417
|
// NOTE: cascade_partial_failure is handled INLINE in the bind remove +
|
|
1418
1418
|
// bind cleanup command files (the rendering needs the structured
|
|
@@ -1477,15 +1477,15 @@ var LOCAL_RULES = {
|
|
|
1477
1477
|
// Task 15+16
|
|
1478
1478
|
KV_URI_NOT_FOUND: "Pass `--kv-uri` or set `AZURE_KEYVAULT_URI` / `KEYVAULT_URI`.",
|
|
1479
1479
|
// Task 13 — brain-link
|
|
1480
|
-
LINK_NO_INSTALLATION_ID: "Internal error \u2014 the CLI command must poll for the installation id before calling linkBrain. Report at https://github.com/m8t
|
|
1480
|
+
LINK_NO_INSTALLATION_ID: "Internal error \u2014 the CLI command must poll for the installation id before calling linkBrain. Report at https://github.com/m8t/m8t/issues.",
|
|
1481
1481
|
// Task 16 — brain link command
|
|
1482
|
-
M8T_REPO_ROOT_MISSING: "Re-run `m8t install` from a fresh m8t
|
|
1482
|
+
M8T_REPO_ROOT_MISSING: "Re-run `m8t install` from a fresh m8t checkout \u2014 the post-install hook writes ~/.m8t/repo-root.",
|
|
1483
1483
|
// Task 14 — persona-render
|
|
1484
|
-
PERSONA_PATH_NOT_ABSOLUTE: "The persona path in ~/.m8t
|
|
1484
|
+
PERSONA_PATH_NOT_ABSOLUTE: "The persona path in ~/.m8t/foundry/<worker>.yaml must be absolute. Re-deploy the worker via the architect.",
|
|
1485
1485
|
// Task 9 — persona-render
|
|
1486
|
-
PERSONA_PLACEHOLDER_UNSATISFIED: "Re-deploy the worker via the architect to repopulate fillableFieldValues, OR edit ~/.m8t
|
|
1486
|
+
PERSONA_PLACEHOLDER_UNSATISFIED: "Re-deploy the worker via the architect to repopulate fillableFieldValues, OR edit ~/.m8t/foundry/<worker>.yaml manually.",
|
|
1487
1487
|
// Task 9 — persona-render
|
|
1488
|
-
PERSONA_READ_FAILED: "Verify the persona path in ~/.m8t
|
|
1488
|
+
PERSONA_READ_FAILED: "Verify the persona path in ~/.m8t/foundry/<worker>.yaml; the architect should have populated it at deploy time.",
|
|
1489
1489
|
// ── pre-existing entries ──────────────────────────────────────────────────
|
|
1490
1490
|
AUTH_NOT_SIGNED_IN: "you are not signed in to Azure \u2014 run 'az login' first.",
|
|
1491
1491
|
AUTH_EXPIRED: "your Azure login expired \u2014 run 'az login' to re-authenticate.",
|
|
@@ -11747,7 +11747,7 @@ import * as path2 from "path";
|
|
|
11747
11747
|
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
11748
11748
|
function configDir() {
|
|
11749
11749
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
11750
|
-
return path2.join(home, ".m8t
|
|
11750
|
+
return path2.join(home, ".m8t");
|
|
11751
11751
|
}
|
|
11752
11752
|
function getConfigPath() {
|
|
11753
11753
|
return path2.join(configDir(), "cli-config.yaml");
|
|
@@ -11810,7 +11810,7 @@ async function discoverGateway(opts) {
|
|
|
11810
11810
|
const candidates = [];
|
|
11811
11811
|
try {
|
|
11812
11812
|
for await (const app of client.containerApps.listBySubscription()) {
|
|
11813
|
-
if (app.tags?.
|
|
11813
|
+
if (app.tags?.m8t !== "gateway") continue;
|
|
11814
11814
|
const fqdn2 = app.configuration?.ingress?.fqdn;
|
|
11815
11815
|
const envs = app.template?.containers?.[0]?.env ?? [];
|
|
11816
11816
|
const envMap = /* @__PURE__ */ new Map();
|
|
@@ -11839,7 +11839,7 @@ async function discoverGateway(opts) {
|
|
|
11839
11839
|
if (candidates.length === 0) {
|
|
11840
11840
|
throw new LocalCliError({
|
|
11841
11841
|
code: "GATEWAY_DISCOVERY_ZERO",
|
|
11842
|
-
message: `No m8t
|
|
11842
|
+
message: `No m8t deployment found in subscription ${subscriptionId}.`,
|
|
11843
11843
|
hint: "If the deployment is in another subscription, run 'az account set --subscription <name>'."
|
|
11844
11844
|
});
|
|
11845
11845
|
}
|
|
@@ -11850,8 +11850,8 @@ async function discoverGateway(opts) {
|
|
|
11850
11850
|
if (pool.length === 0) {
|
|
11851
11851
|
throw new LocalCliError({
|
|
11852
11852
|
code: "GATEWAY_DISCOVERY_RG_NOT_FOUND",
|
|
11853
|
-
message: `No m8t
|
|
11854
|
-
hint: `m8t
|
|
11853
|
+
message: `No m8t gateway found in resource group '${opts.resourceGroup}' (subscription ${subscriptionId}).`,
|
|
11854
|
+
hint: `m8t gateways in this subscription: ${candidates.map((c) => c.resourceGroup).join(", ")}.`
|
|
11855
11855
|
});
|
|
11856
11856
|
}
|
|
11857
11857
|
}
|
|
@@ -11860,7 +11860,7 @@ async function discoverGateway(opts) {
|
|
|
11860
11860
|
chosen = pool[0];
|
|
11861
11861
|
} else if (opts.interactive) {
|
|
11862
11862
|
const resourceId = await select({
|
|
11863
|
-
message: `Multiple m8t
|
|
11863
|
+
message: `Multiple m8t deployments found in subscription ${subscriptionId}. Choose one:`,
|
|
11864
11864
|
choices: pool.map((c) => ({
|
|
11865
11865
|
name: `${c.name} (rg=${c.resourceGroup}, ${c.location})`,
|
|
11866
11866
|
value: c.resourceId
|
|
@@ -11877,7 +11877,7 @@ async function discoverGateway(opts) {
|
|
|
11877
11877
|
} else {
|
|
11878
11878
|
throw new LocalCliError({
|
|
11879
11879
|
code: "GATEWAY_DISCOVERY_MULTIPLE",
|
|
11880
|
-
message: `Multiple m8t
|
|
11880
|
+
message: `Multiple m8t gateways found in subscription ${subscriptionId}: ${pool.map((c) => `${c.name} (rg=${c.resourceGroup}, ${c.location})`).join("; ")}.`,
|
|
11881
11881
|
hint: `Re-run with --resource-group <rg> to pick one (e.g. --resource-group ${pool[0].resourceGroup}).`
|
|
11882
11882
|
});
|
|
11883
11883
|
}
|
|
@@ -11965,7 +11965,7 @@ var BindAddCommand = class extends M8tCommand {
|
|
|
11965
11965
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
11966
11966
|
});
|
|
11967
11967
|
resourceGroup = Option.String("--resource-group", {
|
|
11968
|
-
description: "m8t
|
|
11968
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
11969
11969
|
});
|
|
11970
11970
|
async executeCommand() {
|
|
11971
11971
|
if (!this.worker) {
|
|
@@ -12048,7 +12048,7 @@ var BindCleanupCommand = class extends M8tCommand {
|
|
|
12048
12048
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12049
12049
|
});
|
|
12050
12050
|
resourceGroup = Option2.String("--resource-group", {
|
|
12051
|
-
description: "m8t
|
|
12051
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12052
12052
|
});
|
|
12053
12053
|
async executeCommand() {
|
|
12054
12054
|
if (this.bindingId && this.allOrphaned) {
|
|
@@ -12189,7 +12189,7 @@ var BindListCommand = class extends M8tCommand {
|
|
|
12189
12189
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12190
12190
|
});
|
|
12191
12191
|
resourceGroup = Option3.String("--resource-group", {
|
|
12192
|
-
description: "m8t
|
|
12192
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12193
12193
|
});
|
|
12194
12194
|
async executeCommand() {
|
|
12195
12195
|
const mode = resolveOutputMode(
|
|
@@ -12269,7 +12269,7 @@ var BindRemoveCommand = class extends M8tCommand {
|
|
|
12269
12269
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12270
12270
|
});
|
|
12271
12271
|
resourceGroup = Option4.String("--resource-group", {
|
|
12272
|
-
description: "m8t
|
|
12272
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12273
12273
|
});
|
|
12274
12274
|
async executeCommand() {
|
|
12275
12275
|
const mode = resolveOutputMode(
|
|
@@ -12348,7 +12348,7 @@ var BindShowCommand = class extends M8tCommand {
|
|
|
12348
12348
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12349
12349
|
});
|
|
12350
12350
|
resourceGroup = Option5.String("--resource-group", {
|
|
12351
|
-
description: "m8t
|
|
12351
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12352
12352
|
});
|
|
12353
12353
|
async executeCommand() {
|
|
12354
12354
|
const mode = resolveOutputMode(
|
|
@@ -12422,7 +12422,7 @@ var FOUNDRY_CONFIG_KEYS = ["tenantId", "clientId", "projectEndpoint"];
|
|
|
12422
12422
|
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
12423
12423
|
function configDir2() {
|
|
12424
12424
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
12425
|
-
return path3.join(home, ".m8t
|
|
12425
|
+
return path3.join(home, ".m8t");
|
|
12426
12426
|
}
|
|
12427
12427
|
function getFoundryConfigPath() {
|
|
12428
12428
|
return path3.join(configDir2(), "config.yaml");
|
|
@@ -12539,7 +12539,7 @@ init_errors();
|
|
|
12539
12539
|
var ConfigSetCommand = class extends M8tCommand {
|
|
12540
12540
|
static paths = [["config", "set"]];
|
|
12541
12541
|
static usage = Command8.Usage({
|
|
12542
|
-
description: "Set a value in ~/.m8t
|
|
12542
|
+
description: "Set a value in ~/.m8t/config.yaml (tenantId | clientId | projectEndpoint)."
|
|
12543
12543
|
});
|
|
12544
12544
|
key = Option7.String();
|
|
12545
12545
|
value = Option7.String();
|
|
@@ -12574,7 +12574,7 @@ import { Command as Command9, Option as Option8 } from "clipanion";
|
|
|
12574
12574
|
var ConfigShowCommand = class extends M8tCommand {
|
|
12575
12575
|
static paths = [["config", "show"]];
|
|
12576
12576
|
static usage = Command9.Usage({
|
|
12577
|
-
description: "Show ~/.m8t
|
|
12577
|
+
description: "Show ~/.m8t/config.yaml (tenant/client/project) + the cached gateway.",
|
|
12578
12578
|
details: "Displays the Foundry config (config.yaml) and the gateway discovery cache (cli-config.yaml)."
|
|
12579
12579
|
});
|
|
12580
12580
|
output = Option8.String("--output");
|
|
@@ -12648,7 +12648,7 @@ var TeamAddCommand = class extends M8tCommand {
|
|
|
12648
12648
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12649
12649
|
});
|
|
12650
12650
|
resourceGroup = Option9.String("--resource-group", {
|
|
12651
|
-
description: "m8t
|
|
12651
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12652
12652
|
});
|
|
12653
12653
|
async executeCommand() {
|
|
12654
12654
|
const identities = {};
|
|
@@ -12741,7 +12741,7 @@ var TeamAddIdentityCommand = class extends M8tCommand {
|
|
|
12741
12741
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12742
12742
|
});
|
|
12743
12743
|
resourceGroup = Option10.String("--resource-group", {
|
|
12744
|
-
description: "m8t
|
|
12744
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12745
12745
|
});
|
|
12746
12746
|
async executeCommand() {
|
|
12747
12747
|
const identities = {};
|
|
@@ -12801,7 +12801,7 @@ var TeamListCommand = class extends M8tCommand {
|
|
|
12801
12801
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12802
12802
|
});
|
|
12803
12803
|
resourceGroup = Option11.String("--resource-group", {
|
|
12804
|
-
description: "m8t
|
|
12804
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12805
12805
|
});
|
|
12806
12806
|
async executeCommand() {
|
|
12807
12807
|
const mode = resolveOutputMode(
|
|
@@ -12870,7 +12870,7 @@ var TeamRemoveCommand = class extends M8tCommand {
|
|
|
12870
12870
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12871
12871
|
});
|
|
12872
12872
|
resourceGroup = Option12.String("--resource-group", {
|
|
12873
|
-
description: "m8t
|
|
12873
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12874
12874
|
});
|
|
12875
12875
|
async executeCommand() {
|
|
12876
12876
|
const mode = resolveOutputMode(
|
|
@@ -12934,7 +12934,7 @@ var TeamRemoveIdentityCommand = class extends M8tCommand {
|
|
|
12934
12934
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12935
12935
|
});
|
|
12936
12936
|
resourceGroup = Option13.String("--resource-group", {
|
|
12937
|
-
description: "m8t
|
|
12937
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
12938
12938
|
});
|
|
12939
12939
|
async executeCommand() {
|
|
12940
12940
|
const channels = [];
|
|
@@ -12997,7 +12997,7 @@ var TeamShowCommand = class extends M8tCommand {
|
|
|
12997
12997
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
12998
12998
|
});
|
|
12999
12999
|
resourceGroup = Option14.String("--resource-group", {
|
|
13000
|
-
description: "m8t
|
|
13000
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
13001
13001
|
});
|
|
13002
13002
|
async executeCommand() {
|
|
13003
13003
|
const mode = resolveOutputMode(
|
|
@@ -13492,8 +13492,8 @@ var BrainAppCreateCommand = class extends M8tCommand {
|
|
|
13492
13492
|
});
|
|
13493
13493
|
}
|
|
13494
13494
|
const org = this.org;
|
|
13495
|
-
const pemOut = typeof this.pemOut === "string" ? this.pemOut : path4.join(os.homedir(), ".m8t
|
|
13496
|
-
const credsOut = typeof this.credsOut === "string" ? this.credsOut : path4.join(os.homedir(), ".m8t
|
|
13495
|
+
const pemOut = typeof this.pemOut === "string" ? this.pemOut : path4.join(os.homedir(), ".m8t", "github-app.pem");
|
|
13496
|
+
const credsOut = typeof this.credsOut === "string" ? this.credsOut : path4.join(os.homedir(), ".m8t", "github-app.json");
|
|
13497
13497
|
const port = Number(this.port);
|
|
13498
13498
|
const onProgress = (m) => this.context.stderr.write(` ${colors.dim(m)}
|
|
13499
13499
|
`);
|
|
@@ -13591,7 +13591,7 @@ function discoverKvUri(env, override) {
|
|
|
13591
13591
|
});
|
|
13592
13592
|
}
|
|
13593
13593
|
function tryResolveRepoRoot() {
|
|
13594
|
-
const marker = path5.join(os2.homedir(), ".m8t
|
|
13594
|
+
const marker = path5.join(os2.homedir(), ".m8t", "repo-root");
|
|
13595
13595
|
if (!fs5.existsSync(marker)) return null;
|
|
13596
13596
|
const root = fs5.readFileSync(marker, "utf8").trim();
|
|
13597
13597
|
return root.length > 0 ? root : null;
|
|
@@ -13601,7 +13601,7 @@ function resolveRepoRoot() {
|
|
|
13601
13601
|
if (root === null) {
|
|
13602
13602
|
throw new LocalCliError({
|
|
13603
13603
|
code: "M8T_REPO_ROOT_MISSING",
|
|
13604
|
-
message: "~/.m8t
|
|
13604
|
+
message: "~/.m8t/repo-root marker missing \u2014 m8t install never completed."
|
|
13605
13605
|
});
|
|
13606
13606
|
}
|
|
13607
13607
|
return root;
|
|
@@ -13756,7 +13756,7 @@ import * as path6 from "path";
|
|
|
13756
13756
|
import * as os3 from "os";
|
|
13757
13757
|
import { parse as parseYaml3, stringify as stringifyYaml3 } from "yaml";
|
|
13758
13758
|
function agentYamlPath(agentName, home = os3.homedir()) {
|
|
13759
|
-
return path6.join(home, ".m8t
|
|
13759
|
+
return path6.join(home, ".m8t", "foundry", `${agentName}.yaml`);
|
|
13760
13760
|
}
|
|
13761
13761
|
function readAgentYaml(agentName, home) {
|
|
13762
13762
|
const file = agentYamlPath(agentName, home);
|
|
@@ -13837,7 +13837,7 @@ function renderPersonaBody(personaPath, fillableFieldValues, instanceName) {
|
|
|
13837
13837
|
throw new LocalCliError({
|
|
13838
13838
|
code: "PERSONA_PLACEHOLDER_UNSATISFIED",
|
|
13839
13839
|
message: `Persona '${personaPath}' has un-substituted placeholders: ${names.join(", ")}`,
|
|
13840
|
-
hint: `Add these to fillableFieldValues in ~/.m8t
|
|
13840
|
+
hint: `Add these to fillableFieldValues in ~/.m8t/foundry/<agent>.yaml, or re-deploy the agent via the architect to repopulate.`
|
|
13841
13841
|
});
|
|
13842
13842
|
}
|
|
13843
13843
|
const out = rendered.replace(/\s+$/, "");
|
|
@@ -14685,7 +14685,7 @@ var BrainCreateCommand = class extends M8tCommand {
|
|
|
14685
14685
|
static paths = [["brain", "create"]];
|
|
14686
14686
|
static usage = Command18.Usage({
|
|
14687
14687
|
description: "Create a new brain repo from brain-template/ (optionally seeded) and link it to <worker>.",
|
|
14688
|
-
details: "Copies ~/.m8t
|
|
14688
|
+
details: "Copies ~/.m8t/repo-root/brain-template/ to a tmp dir, optionally overlays brain-seeds/<name>/ (via --seed), stages it as a git repo, runs gh repo create --source --push, then the link cascade. Default --repo-name: <worker>-brain. Default visibility: private.",
|
|
14689
14689
|
examples: [
|
|
14690
14690
|
["Create + link with defaults", "$0 brain create cmo --owner orkeren21"],
|
|
14691
14691
|
["Custom name + public", "$0 brain create cmo --owner orkeren21 --repo-name cmo-second-brain --public"],
|
|
@@ -15110,7 +15110,7 @@ async function listM8tAgents(args) {
|
|
|
15110
15110
|
if (!raw.name && !raw.id) continue;
|
|
15111
15111
|
const name = String(raw.name ?? raw.id);
|
|
15112
15112
|
const md = raw.metadata ?? raw.versions?.latest?.metadata ?? {};
|
|
15113
|
-
if (md.source === "m8t
|
|
15113
|
+
if (md.source === "m8t") {
|
|
15114
15114
|
result.push({ name, metadata: md });
|
|
15115
15115
|
}
|
|
15116
15116
|
}
|
|
@@ -15270,12 +15270,12 @@ async function unlinkBrain(args) {
|
|
|
15270
15270
|
if (yaml?.personaPath) {
|
|
15271
15271
|
let personaPath = yaml.personaPath;
|
|
15272
15272
|
if (!personaPath.startsWith("/")) {
|
|
15273
|
-
const marker = path11.join(args.home ?? os5.homedir(), ".m8t
|
|
15273
|
+
const marker = path11.join(args.home ?? os5.homedir(), ".m8t", "repo-root");
|
|
15274
15274
|
if (!fs12.existsSync(marker)) {
|
|
15275
15275
|
throw new LocalCliError({
|
|
15276
15276
|
code: "PERSONA_PATH_NOT_ABSOLUTE",
|
|
15277
15277
|
message: `personaPath '${personaPath}' is relative and the repo-root marker is missing.`,
|
|
15278
|
-
hint: "Re-run 'm8t install' from a fresh m8t
|
|
15278
|
+
hint: "Re-run 'm8t install' from a fresh m8t checkout (writes ~/.m8t/repo-root) \u2014 or edit the personaPath to absolute."
|
|
15279
15279
|
});
|
|
15280
15280
|
}
|
|
15281
15281
|
personaPath = path11.join(fs12.readFileSync(marker, "utf8").trim(), personaPath);
|
|
@@ -15629,7 +15629,7 @@ var AgentDeployAdvisorCommand = class extends M8tCommand {
|
|
|
15629
15629
|
description: "Azure subscription ID. Defaults to the current az account."
|
|
15630
15630
|
});
|
|
15631
15631
|
repoRootFlag = Option22.String("--repo-root", {
|
|
15632
|
-
description: "Path to the m8t
|
|
15632
|
+
description: "Path to the m8t repo checkout. Defaults to the ~/.m8t/repo-root marker."
|
|
15633
15633
|
});
|
|
15634
15634
|
output = Option22.String("--output", {
|
|
15635
15635
|
description: "Output format: pretty (default) or json."
|
|
@@ -15641,7 +15641,7 @@ var AgentDeployAdvisorCommand = class extends M8tCommand {
|
|
|
15641
15641
|
throw new LocalCliError({
|
|
15642
15642
|
code: "USAGE",
|
|
15643
15643
|
message: "--persona is required (e.g. --persona startup-advisor).",
|
|
15644
|
-
hint: "Pass the persona directory name under personas/ in your m8t
|
|
15644
|
+
hint: "Pass the persona directory name under personas/ in your m8t checkout."
|
|
15645
15645
|
});
|
|
15646
15646
|
}
|
|
15647
15647
|
if (!agentName) {
|
|
@@ -16170,7 +16170,7 @@ var AgentRemoveCommand = class extends M8tCommand {
|
|
|
16170
16170
|
subscription = Option23.String("--subscription");
|
|
16171
16171
|
kvUri = Option23.String("--kv-uri");
|
|
16172
16172
|
resourceGroup = Option23.String("--resource-group", {
|
|
16173
|
-
description: "m8t
|
|
16173
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
16174
16174
|
});
|
|
16175
16175
|
output = Option23.String("--output");
|
|
16176
16176
|
async executeCommand() {
|
|
@@ -16305,7 +16305,7 @@ function resolveBridgeUrl(opts) {
|
|
|
16305
16305
|
throw new LocalCliError({
|
|
16306
16306
|
code: "A2A_NO_GATEWAY_URL",
|
|
16307
16307
|
message: "Could not resolve the gateway URL for the A2A bridge.",
|
|
16308
|
-
hint: "Pass --gateway-url https://<gateway-fqdn>, set M8T_GATEWAY_URL, or add a gatewayUrl key to ~/.m8t
|
|
16308
|
+
hint: "Pass --gateway-url https://<gateway-fqdn>, set M8T_GATEWAY_URL, or add a gatewayUrl key to ~/.m8t/config.yaml."
|
|
16309
16309
|
});
|
|
16310
16310
|
}
|
|
16311
16311
|
return `${base}${A2A_PATH}`;
|
|
@@ -16317,7 +16317,7 @@ function clean(v) {
|
|
|
16317
16317
|
return t.length ? t : void 0;
|
|
16318
16318
|
}
|
|
16319
16319
|
function readConfigGatewayUrl(home) {
|
|
16320
|
-
const cfg = path13.join(home ?? os6.homedir(), ".m8t
|
|
16320
|
+
const cfg = path13.join(home ?? os6.homedir(), ".m8t", "config.yaml");
|
|
16321
16321
|
if (!fs16.existsSync(cfg)) return void 0;
|
|
16322
16322
|
try {
|
|
16323
16323
|
const o = parseYaml8(fs16.readFileSync(cfg, "utf8"));
|
|
@@ -16538,7 +16538,7 @@ function checkArchitectDrift() {
|
|
|
16538
16538
|
match: false,
|
|
16539
16539
|
sourceVersion: "",
|
|
16540
16540
|
installedVersion: "",
|
|
16541
|
-
advice: `Source persona not found at ${sourcePath}. Check ~/.m8t
|
|
16541
|
+
advice: `Source persona not found at ${sourcePath}. Check ~/.m8t/repo-root points at a valid checkout.`
|
|
16542
16542
|
};
|
|
16543
16543
|
}
|
|
16544
16544
|
const sourceVersion = readVersionFrontmatter(sourcePath);
|
|
@@ -16980,7 +16980,7 @@ async function assertPlatformLive(opts) {
|
|
|
16980
16980
|
if (e.code === "GATEWAY_DISCOVERY_ZERO") {
|
|
16981
16981
|
throw new LocalCliError({
|
|
16982
16982
|
code: "PLATFORM_NOT_LIVE",
|
|
16983
|
-
message: "The m8t
|
|
16983
|
+
message: "The m8t platform isn't deployed yet \u2014 there is no gateway in this subscription.",
|
|
16984
16984
|
hint: "Deploy it first: run the local bootstrap (`m8t bootstrap launch \u2026`) and wait for `m8t bootstrap status` to reach done. If it's in another subscription, run `az account set --subscription <id>`.",
|
|
16985
16985
|
cause: e
|
|
16986
16986
|
});
|
|
@@ -17154,7 +17154,7 @@ var CoderDeployCommand = class extends M8tCommand {
|
|
|
17154
17154
|
cpu: preset.cpu,
|
|
17155
17155
|
memory: preset.memory,
|
|
17156
17156
|
env,
|
|
17157
|
-
metadata: { ...currentMetadata, source: "m8t
|
|
17157
|
+
metadata: { ...currentMetadata, source: "m8t", kind: "hosted", persona: personaName, personaVersion },
|
|
17158
17158
|
onProgress
|
|
17159
17159
|
});
|
|
17160
17160
|
if (typeof this.brain === "string") {
|
|
@@ -17267,7 +17267,7 @@ var CoderDeployCommand = class extends M8tCommand {
|
|
|
17267
17267
|
this.context.stdout.write(` project: ${project.projectName} (${project.region})
|
|
17268
17268
|
`);
|
|
17269
17269
|
this.context.stdout.write(
|
|
17270
|
-
` ${colors.hint("next:")} it now appears on MCP (/m8t
|
|
17270
|
+
` ${colors.hint("next:")} it now appears on MCP (/m8t:workers), the web app, and (when --gateway-url was passed) as an a2a target.
|
|
17271
17271
|
`
|
|
17272
17272
|
);
|
|
17273
17273
|
return 0;
|
|
@@ -17601,7 +17601,7 @@ var AzureExecDeployCommand = class extends M8tCommand {
|
|
|
17601
17601
|
cpu: preset.cpu,
|
|
17602
17602
|
memory: preset.memory,
|
|
17603
17603
|
env,
|
|
17604
|
-
metadata: { source: "m8t
|
|
17604
|
+
metadata: { source: "m8t", kind: "hosted", persona: personaName, personaVersion },
|
|
17605
17605
|
onProgress
|
|
17606
17606
|
});
|
|
17607
17607
|
onProgress?.(`granting Contributor at ${grantScope}\u2026`);
|
|
@@ -18061,7 +18061,7 @@ async function resolveReleaseContent(manifest, opts = {}) {
|
|
|
18061
18061
|
return opts.contentDir;
|
|
18062
18062
|
}
|
|
18063
18063
|
const commit = manifest.platform.commit;
|
|
18064
|
-
const cacheRoot = opts.cacheRoot ?? path19.join(os8.homedir(), ".m8t
|
|
18064
|
+
const cacheRoot = opts.cacheRoot ?? path19.join(os8.homedir(), ".m8t", "cache");
|
|
18065
18065
|
const dest = path19.join(cacheRoot, `release-${commit}`);
|
|
18066
18066
|
if (fs20.existsSync(path19.join(dest, "personas"))) return dest;
|
|
18067
18067
|
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
@@ -18125,7 +18125,7 @@ async function discoverStampStorage(opts) {
|
|
|
18125
18125
|
url: `${ARM3}/subscriptions/${opts.subscriptionId}/resourceGroups/${opts.resourceGroup}/providers/Microsoft.Storage/storageAccounts?api-version=${STORAGE_API}`
|
|
18126
18126
|
}) ?? {};
|
|
18127
18127
|
const accounts = (list.value ?? []).filter((a) => a.properties?.primaryEndpoints?.table);
|
|
18128
|
-
const chosen = accounts.find((a) => a.tags?.
|
|
18128
|
+
const chosen = accounts.find((a) => a.tags?.m8t === "storage") ?? accounts.find((a) => a.tags?.["m8t:role"] === "gateway" || a.tags?.["m8t:role"] === "ledger") ?? (accounts.length === 1 ? accounts[0] : void 0);
|
|
18129
18129
|
const tableEndpoint = chosen?.properties?.primaryEndpoints?.table?.replace(/\/$/, "");
|
|
18130
18130
|
if (!tableEndpoint || !chosen?.id || !chosen.name) {
|
|
18131
18131
|
throw new LocalCliError({
|
|
@@ -18280,7 +18280,7 @@ function buildBicepParams(p) {
|
|
|
18280
18280
|
return params;
|
|
18281
18281
|
}
|
|
18282
18282
|
async function resolveRepoRoot2(home = os9.homedir()) {
|
|
18283
|
-
const marker = path20.join(home, ".m8t
|
|
18283
|
+
const marker = path20.join(home, ".m8t", "repo-root");
|
|
18284
18284
|
try {
|
|
18285
18285
|
const root = (await fs21.readFile(marker, "utf8")).trim();
|
|
18286
18286
|
if (!root) throw new Error("empty");
|
|
@@ -18288,8 +18288,8 @@ async function resolveRepoRoot2(home = os9.homedir()) {
|
|
|
18288
18288
|
} catch {
|
|
18289
18289
|
throw new LocalCliError({
|
|
18290
18290
|
code: "DEPLOY_NO_REPO_ROOT",
|
|
18291
|
-
message: "~/.m8t
|
|
18292
|
-
hint: "Run 'm8t install' from an m8t
|
|
18291
|
+
message: "~/.m8t/repo-root marker is missing or empty.",
|
|
18292
|
+
hint: "Run 'm8t install' from an m8t checkout (it writes the marker), or run 'm8t deploy' from the repo."
|
|
18293
18293
|
});
|
|
18294
18294
|
}
|
|
18295
18295
|
}
|
|
@@ -18353,7 +18353,7 @@ async function ensureResourceGroup(name, location) {
|
|
|
18353
18353
|
await runAz(["group", "show", "--name", name, "--output", "json"]).catch(() => "") || "null"
|
|
18354
18354
|
);
|
|
18355
18355
|
if (existing) return;
|
|
18356
|
-
await runAz(["group", "create", "--name", name, "--location", location, "--tags", "m8t
|
|
18356
|
+
await runAz(["group", "create", "--name", name, "--location", location, "--tags", "m8t=deployment"]);
|
|
18357
18357
|
}
|
|
18358
18358
|
function resolveAcrPullIdentity(opts) {
|
|
18359
18359
|
return opts.explicit ?? "";
|
|
@@ -18825,13 +18825,13 @@ var PlatformStatusCommand = class extends M8tCommand {
|
|
|
18825
18825
|
});
|
|
18826
18826
|
subscription = Option29.String("--subscription");
|
|
18827
18827
|
resourceGroup = Option29.String("--resource-group", {
|
|
18828
|
-
description: "m8t
|
|
18828
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
18829
18829
|
});
|
|
18830
18830
|
to = Option29.String("--to", {
|
|
18831
18831
|
description: "Check status against a pinned platform version (defaults to the current release channel)."
|
|
18832
18832
|
});
|
|
18833
18833
|
contentDir = Option29.String("--content-dir", {
|
|
18834
|
-
description: "Path to a local m8t
|
|
18834
|
+
description: "Path to a local m8t repo checkout (skips the tarball tree-SHA fetch)."
|
|
18835
18835
|
});
|
|
18836
18836
|
manifestUrl = Option29.String("--manifest-url", {
|
|
18837
18837
|
description: "Fetch the release manifest from this URL instead of the release channel."
|
|
@@ -19559,7 +19559,7 @@ var PlatformUpdateCommand = class extends M8tCommand {
|
|
|
19559
19559
|
});
|
|
19560
19560
|
subscription = Option30.String("--subscription");
|
|
19561
19561
|
resourceGroup = Option30.String("--resource-group", {
|
|
19562
|
-
description: "m8t
|
|
19562
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
19563
19563
|
});
|
|
19564
19564
|
to = Option30.String("--to", {
|
|
19565
19565
|
description: "Pin the platform version to converge to (defaults to the current release channel)."
|
|
@@ -19575,7 +19575,7 @@ var PlatformUpdateCommand = class extends M8tCommand {
|
|
|
19575
19575
|
description: "Required with --force-infra \u2014 the existing deployment's resource-name suffix (avoids provisioning duplicates)."
|
|
19576
19576
|
});
|
|
19577
19577
|
contentDir = Option30.String("--content-dir", {
|
|
19578
|
-
description: "Path to a local m8t
|
|
19578
|
+
description: "Path to a local m8t repo checkout (skips the tarball fetch + tree-drift check)."
|
|
19579
19579
|
});
|
|
19580
19580
|
manifestUrl = Option30.String("--manifest-url", {
|
|
19581
19581
|
description: "Fetch the release manifest from this URL instead of the release channel."
|
|
@@ -20249,7 +20249,7 @@ var PlatformEnableCostReportCommand = class extends M8tCommand {
|
|
|
20249
20249
|
});
|
|
20250
20250
|
subscription = Option31.String("--subscription");
|
|
20251
20251
|
resourceGroup = Option31.String("--resource-group", {
|
|
20252
|
-
description: "m8t
|
|
20252
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
20253
20253
|
});
|
|
20254
20254
|
acsEndpoint = Option31.String("--acs-endpoint", { required: true, description: "ACS data-plane endpoint, e.g. https://acs-<name>.communication.azure.com/" });
|
|
20255
20255
|
acsSender = Option31.String("--acs-sender", { required: true, description: "Managed-domain sender address, e.g. DoNotReply@<guid>.azurecomm.net" });
|
|
@@ -20341,7 +20341,7 @@ var PlatformEnableAutoUpdateCommand = class extends M8tCommand {
|
|
|
20341
20341
|
});
|
|
20342
20342
|
subscription = Option32.String("--subscription");
|
|
20343
20343
|
resourceGroup = Option32.String("--resource-group", {
|
|
20344
|
-
description: "m8t
|
|
20344
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
20345
20345
|
});
|
|
20346
20346
|
suffix = Option32.String("--suffix", {
|
|
20347
20347
|
description: "The existing deployment's resource-name suffix. Required when it cannot be recovered from system/infra-params or the live gateway."
|
|
@@ -20485,7 +20485,7 @@ import { Command as Command36, Option as Option33 } from "clipanion";
|
|
|
20485
20485
|
|
|
20486
20486
|
// src/lib/app-reg.ts
|
|
20487
20487
|
init_errors();
|
|
20488
|
-
var APP_NAME = "m8t-
|
|
20488
|
+
var APP_NAME = "m8t-webapp";
|
|
20489
20489
|
var AZURE_CLI_FIRST_PARTY_APP_ID = "04b07795-8ddb-461a-bbee-02f9e1bf7b46";
|
|
20490
20490
|
var FOUNDRY_SP_APP_ID = "18a66f5f-dbdf-4c17-9dd7-1634712a9cbe";
|
|
20491
20491
|
var USER_IMPERSONATION_SCOPE_ID = "1a7925b5-f871-417a-9b8b-303f9f29fa10";
|
|
@@ -20525,10 +20525,10 @@ async function ensureExposeAnApi(appId, appObjectId) {
|
|
|
20525
20525
|
id: scopeId,
|
|
20526
20526
|
value: "user_impersonation",
|
|
20527
20527
|
type: "User",
|
|
20528
|
-
adminConsentDescription: "Allow the application to access m8t
|
|
20529
|
-
adminConsentDisplayName: "Access m8t
|
|
20530
|
-
userConsentDescription: "Allow the application to access m8t
|
|
20531
|
-
userConsentDisplayName: "Access m8t
|
|
20528
|
+
adminConsentDescription: "Allow the application to access m8t on behalf of the signed-in user.",
|
|
20529
|
+
adminConsentDisplayName: "Access m8t",
|
|
20530
|
+
userConsentDescription: "Allow the application to access m8t on your behalf.",
|
|
20531
|
+
userConsentDisplayName: "Access m8t",
|
|
20532
20532
|
isEnabled: true
|
|
20533
20533
|
}
|
|
20534
20534
|
];
|
|
@@ -20885,7 +20885,7 @@ var DeployCommand = class extends M8tCommand {
|
|
|
20885
20885
|
static paths = [["deploy"]];
|
|
20886
20886
|
static usage = Command36.Usage({
|
|
20887
20887
|
description: "Deploy (or update) the m8t gateway/webapp stack via Bicep.",
|
|
20888
|
-
details: "Ensures the Entra app reg (or pass --client-id to reuse an existing one \u2014 required if you can't create app regs), writes ~/.m8t
|
|
20888
|
+
details: "Ensures the Entra app reg (or pass --client-id to reuse an existing one \u2014 required if you can't create app regs), writes ~/.m8t/config.yaml, ensures the resource group, and runs deploy/main.bicep. The repo is located via ~/.m8t/repo-root."
|
|
20889
20889
|
});
|
|
20890
20890
|
subscription = Option33.String("--subscription");
|
|
20891
20891
|
resourceGroup = Option33.String("--resource-group", "rg-m8t-stack");
|
|
@@ -20934,7 +20934,7 @@ var DeployCommand = class extends M8tCommand {
|
|
|
20934
20934
|
throw new LocalCliError({
|
|
20935
20935
|
code: "DEPLOY_NO_FOUNDRY_ENDPOINT",
|
|
20936
20936
|
message: "No Foundry endpoint provided.",
|
|
20937
|
-
hint: "Pass --foundry-endpoint <url> or set projectEndpoint in ~/.m8t
|
|
20937
|
+
hint: "Pass --foundry-endpoint <url> or set projectEndpoint in ~/.m8t/config.yaml (m8t config set / m8t switch)."
|
|
20938
20938
|
});
|
|
20939
20939
|
}
|
|
20940
20940
|
if (this.whatIf) {
|
|
@@ -20943,7 +20943,7 @@ var DeployCommand = class extends M8tCommand {
|
|
|
20943
20943
|
throw new LocalCliError({
|
|
20944
20944
|
code: "DEPLOY_WHATIF_NO_CLIENT",
|
|
20945
20945
|
message: "--what-if needs a client id but none was provided or configured.",
|
|
20946
|
-
hint: "Pass --client-id <appId>, or run from a host with ~/.m8t
|
|
20946
|
+
hint: "Pass --client-id <appId>, or run from a host with ~/.m8t/config.yaml."
|
|
20947
20947
|
});
|
|
20948
20948
|
}
|
|
20949
20949
|
const foundryResourceId2 = await resolveFoundryResourceId(foundryEndpoint, this.foundryResourceId);
|
|
@@ -21564,7 +21564,7 @@ var WhoamiCommand = class extends M8tCommand {
|
|
|
21564
21564
|
description: "Azure subscription ID to discover gateway in (defaults to active az subscription)."
|
|
21565
21565
|
});
|
|
21566
21566
|
resourceGroup = Option37.String("--resource-group", {
|
|
21567
|
-
description: "m8t
|
|
21567
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
21568
21568
|
});
|
|
21569
21569
|
async executeCommand() {
|
|
21570
21570
|
const mode = resolveOutputMode(
|
|
@@ -21752,7 +21752,7 @@ function checkFoundryConfig(cfg) {
|
|
|
21752
21752
|
return {
|
|
21753
21753
|
name: "config.yaml",
|
|
21754
21754
|
status: "FAIL",
|
|
21755
|
-
detail: "missing or invalid ~/.m8t
|
|
21755
|
+
detail: "missing or invalid ~/.m8t/config.yaml",
|
|
21756
21756
|
remediation: "m8t switch (or m8t config set tenantId|clientId|projectEndpoint <value>)"
|
|
21757
21757
|
};
|
|
21758
21758
|
}
|
|
@@ -21876,27 +21876,46 @@ function checkRepoRoot(probe) {
|
|
|
21876
21876
|
return {
|
|
21877
21877
|
name: "brain repo-root",
|
|
21878
21878
|
status: "FAIL",
|
|
21879
|
-
detail: "~/.m8t
|
|
21880
|
-
remediation: 're-run the m8t
|
|
21879
|
+
detail: "~/.m8t/repo-root marker missing \u2014 m8t install never completed",
|
|
21880
|
+
remediation: 're-run the m8t install (writes ~/.m8t/repo-root), or: printf %s "$(git -C <m8t-checkout> rev-parse --show-toplevel)" > ~/.m8t/repo-root'
|
|
21881
21881
|
};
|
|
21882
21882
|
}
|
|
21883
21883
|
if (!probe.isDir) {
|
|
21884
21884
|
return {
|
|
21885
21885
|
name: "brain repo-root",
|
|
21886
21886
|
status: "FAIL",
|
|
21887
|
-
detail: `~/.m8t
|
|
21888
|
-
remediation: 'the m8t
|
|
21887
|
+
detail: `~/.m8t/repo-root \u2192 ${probe.path} \u2014 that path does not exist or is not a directory`,
|
|
21888
|
+
remediation: 'the m8t checkout moved or was deleted; point the marker at the current checkout: printf %s "$(git -C <m8t-checkout> rev-parse --show-toplevel)" > ~/.m8t/repo-root'
|
|
21889
21889
|
};
|
|
21890
21890
|
}
|
|
21891
21891
|
if (!probe.isGitCheckout) {
|
|
21892
21892
|
return {
|
|
21893
21893
|
name: "brain repo-root",
|
|
21894
21894
|
status: "WARN",
|
|
21895
|
-
detail: `~/.m8t
|
|
21896
|
-
remediation: "point the marker at the m8t
|
|
21895
|
+
detail: `~/.m8t/repo-root \u2192 ${probe.path} exists but is not a git checkout (no .git) \u2014 brain-loader template + persona paths may be stale`,
|
|
21896
|
+
remediation: "point the marker at the m8t git checkout (it reads targets/foundry/brain-loader.md from there)"
|
|
21897
21897
|
};
|
|
21898
21898
|
}
|
|
21899
|
-
return { name: "brain repo-root", status: "PASS", detail: `~/.m8t
|
|
21899
|
+
return { name: "brain repo-root", status: "PASS", detail: `~/.m8t/repo-root \u2192 ${probe.path}` };
|
|
21900
|
+
}
|
|
21901
|
+
function checkLegacyStateDir(probe) {
|
|
21902
|
+
if (!probe.legacyExists) {
|
|
21903
|
+
return { name: "state dir", status: "PASS", detail: "no legacy ~/.m8t-stack folder" };
|
|
21904
|
+
}
|
|
21905
|
+
if (!probe.currentExists) {
|
|
21906
|
+
return {
|
|
21907
|
+
name: "state dir",
|
|
21908
|
+
status: "WARN",
|
|
21909
|
+
detail: "found legacy ~/.m8t-stack but no ~/.m8t \u2014 the state folder was renamed to ~/.m8t",
|
|
21910
|
+
remediation: "mv ~/.m8t-stack ~/.m8t"
|
|
21911
|
+
};
|
|
21912
|
+
}
|
|
21913
|
+
return {
|
|
21914
|
+
name: "state dir",
|
|
21915
|
+
status: "WARN",
|
|
21916
|
+
detail: "legacy ~/.m8t-stack exists alongside ~/.m8t \u2014 only ~/.m8t is read",
|
|
21917
|
+
remediation: "review ~/.m8t-stack for anything you still need, then remove it"
|
|
21918
|
+
};
|
|
21900
21919
|
}
|
|
21901
21920
|
|
|
21902
21921
|
// src/commands/doctor.ts
|
|
@@ -21963,7 +21982,7 @@ async function resolveAccountLocation(accountId) {
|
|
|
21963
21982
|
}
|
|
21964
21983
|
}
|
|
21965
21984
|
function probeRepoRoot() {
|
|
21966
|
-
const marker = path28.join(os11.homedir(), ".m8t
|
|
21985
|
+
const marker = path28.join(os11.homedir(), ".m8t", "repo-root");
|
|
21967
21986
|
if (!fs26.existsSync(marker)) {
|
|
21968
21987
|
return { markerExists: false, path: null, isDir: false, isGitCheckout: false };
|
|
21969
21988
|
}
|
|
@@ -21983,6 +22002,12 @@ function probeRepoRoot() {
|
|
|
21983
22002
|
const isGitCheckout = isDir && fs26.existsSync(path28.join(repoPath, ".git"));
|
|
21984
22003
|
return { markerExists: true, path: repoPath, isDir, isGitCheckout };
|
|
21985
22004
|
}
|
|
22005
|
+
function probeLegacyStateDir() {
|
|
22006
|
+
return {
|
|
22007
|
+
legacyExists: fs26.existsSync(path28.join(os11.homedir(), ".m8t-stack")),
|
|
22008
|
+
currentExists: fs26.existsSync(path28.join(os11.homedir(), ".m8t"))
|
|
22009
|
+
};
|
|
22010
|
+
}
|
|
21986
22011
|
var DoctorCommand = class extends M8tCommand {
|
|
21987
22012
|
static paths = [["doctor"]];
|
|
21988
22013
|
static usage = Command42.Usage({
|
|
@@ -21991,7 +22016,7 @@ var DoctorCommand = class extends M8tCommand {
|
|
|
21991
22016
|
output = Option39.String("--output");
|
|
21992
22017
|
agent = Option39.String("--agent");
|
|
21993
22018
|
resourceGroup = Option39.String("--resource-group", {
|
|
21994
|
-
description: "m8t
|
|
22019
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
21995
22020
|
});
|
|
21996
22021
|
async executeCommand() {
|
|
21997
22022
|
const mode = resolveOutputMode(
|
|
@@ -22025,6 +22050,7 @@ var DoctorCommand = class extends M8tCommand {
|
|
|
22025
22050
|
emit(checkFoundryConfig(foundry));
|
|
22026
22051
|
emit(checkTenantAlignment(az, foundry));
|
|
22027
22052
|
emit(checkRepoRoot(probeRepoRoot()));
|
|
22053
|
+
emit(checkLegacyStateDir(probeLegacyStateDir()));
|
|
22028
22054
|
checking("gateway");
|
|
22029
22055
|
let gw = { ok: false, detail: "not probed" };
|
|
22030
22056
|
try {
|
|
@@ -22114,7 +22140,7 @@ import * as path29 from "path";
|
|
|
22114
22140
|
import { parse as parseYaml11, stringify as stringifyYaml4 } from "yaml";
|
|
22115
22141
|
function profilesDir() {
|
|
22116
22142
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
22117
|
-
return path29.join(home, ".m8t
|
|
22143
|
+
return path29.join(home, ".m8t", "profiles");
|
|
22118
22144
|
}
|
|
22119
22145
|
function getProfilePath(name) {
|
|
22120
22146
|
return path29.join(profilesDir(), `${path29.basename(name)}.yaml`);
|
|
@@ -22364,7 +22390,7 @@ var OpenCommand = class extends M8tCommand {
|
|
|
22364
22390
|
print = Option41.Boolean("--print", false);
|
|
22365
22391
|
output = Option41.String("--output");
|
|
22366
22392
|
resourceGroup = Option41.String("--resource-group", {
|
|
22367
|
-
description: "m8t
|
|
22393
|
+
description: "m8t resource group to disambiguate the gateway (multi-deployment subscriptions)."
|
|
22368
22394
|
});
|
|
22369
22395
|
async executeCommand() {
|
|
22370
22396
|
const mode = resolveOutputMode(
|
|
@@ -23173,7 +23199,7 @@ async function runPipeline(args) {
|
|
|
23173
23199
|
({ items, fetchError } = await fetchItems(sources.conversations, recoveredId));
|
|
23174
23200
|
if (g.source === "a2a" && !fetchError && items.length > 0 && sources.conversations.retrieveApp) {
|
|
23175
23201
|
const app = await sources.conversations.retrieveApp(recoveredId);
|
|
23176
|
-
if (app !== "m8t-
|
|
23202
|
+
if (app !== "m8t-a2a") {
|
|
23177
23203
|
didRecover = false;
|
|
23178
23204
|
items = [];
|
|
23179
23205
|
conversationId = void 0;
|
|
@@ -24508,13 +24534,13 @@ async function discoverLedgerResources(opts) {
|
|
|
24508
24534
|
url: `${ARM4}/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.Storage/storageAccounts?api-version=${STORAGE_API2}`
|
|
24509
24535
|
});
|
|
24510
24536
|
const accounts = storage.filter((a) => a.properties?.primaryEndpoints?.table);
|
|
24511
|
-
const ledgerAcct = accounts.find((a) => (a.tags?.["m8t
|
|
24537
|
+
const ledgerAcct = accounts.find((a) => (a.tags?.["m8t:role"] ?? a.properties?.tags?.["m8t:role"]) === "ledger") ?? (accounts.length === 1 ? accounts[0] : void 0);
|
|
24512
24538
|
const ledgerTableEndpoint = ledgerAcct?.properties?.primaryEndpoints?.table?.replace(/\/$/, "");
|
|
24513
24539
|
if (!ledgerTableEndpoint) {
|
|
24514
24540
|
throw new LocalCliError({
|
|
24515
24541
|
code: "DREAM_LEDGER_STORAGE_NOT_FOUND",
|
|
24516
24542
|
message: `No AgentLedger storage account found in resource group ${resourceGroup}.`,
|
|
24517
|
-
hint: `Found: ${accounts.map((a) => a.name).join(", ") || "(none)"}. Tag the ledger account 'm8t
|
|
24543
|
+
hint: `Found: ${accounts.map((a) => a.name).join(", ") || "(none)"}. Tag the ledger account 'm8t:role=ledger'.`
|
|
24518
24544
|
});
|
|
24519
24545
|
}
|
|
24520
24546
|
const ws = await authedJsonPagedValues({
|
|
@@ -25394,7 +25420,7 @@ function buildPreflightBanner(who) {
|
|
|
25394
25420
|
"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557",
|
|
25395
25421
|
"\u2551 \u26D4 STOP \u2014 READ THIS BEFORE CONTINUING \u2551",
|
|
25396
25422
|
"\u2551 \u2551",
|
|
25397
|
-
"\u2551 Installing m8t
|
|
25423
|
+
"\u2551 Installing m8t creates real Azure resources in YOUR \u2551",
|
|
25398
25424
|
"\u2551 subscription and assigns roles. To do that, the account you just \u2551",
|
|
25399
25425
|
"\u2551 signed in with MUST be: \u2551",
|
|
25400
25426
|
"\u2551 \u2551",
|
|
@@ -25418,7 +25444,7 @@ function buildPreflightBanner(who) {
|
|
|
25418
25444
|
var BootstrapPreflightCommand = class extends M8tCommand {
|
|
25419
25445
|
static paths = [["bootstrap", "preflight"]];
|
|
25420
25446
|
static usage = Command48.Usage({
|
|
25421
|
-
description: "Loudly verify you can install m8t
|
|
25447
|
+
description: "Loudly verify you can install m8t (Owner/UAA + directory admin) and hard-stop if not.",
|
|
25422
25448
|
details: "Step 1 of `m8t bootstrap`. Prints an unmissable admin-credentials notice, then checks: Owner or User Access Administrator at subscription scope (hard requirement), directory-admin capability to register the app (or pass --client-id), and registers Microsoft.ContainerInstance. Exits non-zero with the exact failing check + remedy.",
|
|
25423
25449
|
examples: [
|
|
25424
25450
|
["Run the preflight", "$0 bootstrap preflight"],
|
|
@@ -25442,7 +25468,7 @@ var BootstrapPreflightCommand = class extends M8tCommand {
|
|
|
25442
25468
|
}
|
|
25443
25469
|
if (!clientId) {
|
|
25444
25470
|
const appReg = await checkAppRegCapability(oid);
|
|
25445
|
-
this.context.stdout.write(line(appReg.ok, "Directory admin \u2014 can register the m8t
|
|
25471
|
+
this.context.stdout.write(line(appReg.ok, "Directory admin \u2014 can register the m8t app", "first-run app registration"));
|
|
25446
25472
|
if (!appReg.ok) {
|
|
25447
25473
|
this.context.stderr.write(failBlock(
|
|
25448
25474
|
appReg.inconclusive ? "Couldn't verify your directory admin role (Microsoft Graph denied the read \u2014 common for guest accounts)." : "You don't hold a directory admin role (Application / Cloud Application / Global Administrator).",
|
|
@@ -25504,7 +25530,7 @@ async function ensureResourceGroup2(opts) {
|
|
|
25504
25530
|
"--subscription",
|
|
25505
25531
|
opts.subscriptionId,
|
|
25506
25532
|
"--tags",
|
|
25507
|
-
"m8t
|
|
25533
|
+
"m8t=deployment",
|
|
25508
25534
|
"--only-show-errors"
|
|
25509
25535
|
]);
|
|
25510
25536
|
}
|
|
@@ -25710,7 +25736,7 @@ import * as fs29 from "fs/promises";
|
|
|
25710
25736
|
import * as os13 from "os";
|
|
25711
25737
|
import * as path31 from "path";
|
|
25712
25738
|
function stateDir(home) {
|
|
25713
|
-
return path31.join(home, ".m8t
|
|
25739
|
+
return path31.join(home, ".m8t");
|
|
25714
25740
|
}
|
|
25715
25741
|
function statePath(home) {
|
|
25716
25742
|
return path31.join(stateDir(home), "bootstrap.json");
|
|
@@ -25734,19 +25760,19 @@ async function writeBootstrapState(state, home = os13.homedir()) {
|
|
|
25734
25760
|
// src/commands/bootstrap/launch.ts
|
|
25735
25761
|
var DEFAULT_RG = "rg-m8t-stack";
|
|
25736
25762
|
var DEFAULT_INSTALLER = "ghcr.io/m8t-labs/m8t-installer";
|
|
25737
|
-
var DEFAULT_INSTALLER_TAG = "v0.1.
|
|
25763
|
+
var DEFAULT_INSTALLER_TAG = "v0.1.33";
|
|
25738
25764
|
var ACI_NAME = "m8t-installer";
|
|
25739
25765
|
var MI_NAME = "m8t-installer-mi";
|
|
25740
25766
|
var BootstrapLaunchCommand = class extends M8tCommand {
|
|
25741
25767
|
static paths = [["bootstrap", "launch"]];
|
|
25742
25768
|
static usage = Command49.Usage({
|
|
25743
25769
|
description: "Create + authorize the installer managed identity, then kick the cloud installer.",
|
|
25744
|
-
details: "Step 2 of `m8t bootstrap` (run after `preflight`). Ensures the resource group, creates the m8t
|
|
25770
|
+
details: "Step 2 of `m8t bootstrap` (run after `preflight`). Ensures the resource group, creates the m8t app registration (or uses --client-id), creates a user-assigned managed identity granted Owner at subscription scope, and launches the published m8t-installer image as an ACI run-to-completion job under that identity. Writes ~/.m8t/bootstrap.json for `status`/`reap`/`finish`.",
|
|
25745
25771
|
examples: [
|
|
25746
25772
|
["Launch in eastus2", "$0 bootstrap launch --location eastus2"],
|
|
25747
25773
|
["BYO app registration", "$0 bootstrap launch --location eastus2 --client-id <appId>"],
|
|
25748
|
-
["Pin a specific installer tag", "$0 bootstrap launch --location eastus2 --installer-tag v0.1.
|
|
25749
|
-
["Override the full installer image ref", "$0 bootstrap launch --location eastus2 --installer-image ghcr.io/m8t-labs/m8t-installer:v0.1.
|
|
25774
|
+
["Pin a specific installer tag", "$0 bootstrap launch --location eastus2 --installer-tag v0.1.33"],
|
|
25775
|
+
["Override the full installer image ref", "$0 bootstrap launch --location eastus2 --installer-image ghcr.io/m8t-labs/m8t-installer:v0.1.33"]
|
|
25750
25776
|
]
|
|
25751
25777
|
});
|
|
25752
25778
|
location = Option46.String("--location");
|
|
@@ -25775,7 +25801,7 @@ var BootstrapLaunchCommand = class extends M8tCommand {
|
|
|
25775
25801
|
const subscriptionId = (typeof this.subscription === "string" ? this.subscription : void 0) ?? account.subscriptionId;
|
|
25776
25802
|
const out = (m) => this.context.stderr.write(` ${colors.dim(m)}
|
|
25777
25803
|
`);
|
|
25778
|
-
const credsPath = typeof this.githubAppCreds === "string" ? this.githubAppCreds : path32.join(os14.homedir(), ".m8t
|
|
25804
|
+
const credsPath = typeof this.githubAppCreds === "string" ? this.githubAppCreds : path32.join(os14.homedir(), ".m8t", "github-app.json");
|
|
25779
25805
|
let githubApp;
|
|
25780
25806
|
if (fs30.existsSync(credsPath)) {
|
|
25781
25807
|
let parsed;
|
|
@@ -25811,7 +25837,7 @@ var BootstrapLaunchCommand = class extends M8tCommand {
|
|
|
25811
25837
|
}
|
|
25812
25838
|
out("registering Microsoft.ContainerInstance\u2026");
|
|
25813
25839
|
await registerContainerInstance(subscriptionId);
|
|
25814
|
-
out("resolving the m8t
|
|
25840
|
+
out("resolving the m8t app registration\u2026");
|
|
25815
25841
|
const appReg = await ensureAppReg({ tenantId: account.tenantId, clientId: clientIdOpt });
|
|
25816
25842
|
out(`ensuring resource group ${resourceGroup}\u2026`);
|
|
25817
25843
|
await ensureResourceGroup2({ name: resourceGroup, location, subscriptionId });
|
|
@@ -25902,7 +25928,7 @@ var BootstrapStatusCommand = class extends M8tCommand {
|
|
|
25902
25928
|
if (!state) {
|
|
25903
25929
|
throw new LocalCliError({
|
|
25904
25930
|
code: "BOOTSTRAP_NO_STATE",
|
|
25905
|
-
message: "No bootstrap is in flight (no ~/.m8t
|
|
25931
|
+
message: "No bootstrap is in flight (no ~/.m8t/bootstrap.json).",
|
|
25906
25932
|
hint: "Run 'm8t bootstrap launch --location <region>' first."
|
|
25907
25933
|
});
|
|
25908
25934
|
}
|
|
@@ -26353,7 +26379,7 @@ function composeFounderIdentityNote(id) {
|
|
|
26353
26379
|
|
|
26354
26380
|
// src/lib/company-profile-seed.ts
|
|
26355
26381
|
function readGithubAppCreds(credsPath) {
|
|
26356
|
-
const p = credsPath ?? path33.join(os15.homedir(), ".m8t
|
|
26382
|
+
const p = credsPath ?? path33.join(os15.homedir(), ".m8t", "github-app.json");
|
|
26357
26383
|
try {
|
|
26358
26384
|
return JSON.parse(readFileSync20(p, "utf8"));
|
|
26359
26385
|
} catch {
|
|
@@ -26418,7 +26444,7 @@ async function applyProfileToBrain(args) {
|
|
|
26418
26444
|
});
|
|
26419
26445
|
}
|
|
26420
26446
|
function spawnDetachedSeedWatch() {
|
|
26421
|
-
const logPath = path33.join(os15.homedir(), ".m8t
|
|
26447
|
+
const logPath = path33.join(os15.homedir(), ".m8t", "seed-profile.log");
|
|
26422
26448
|
const fd = openSync(logPath, "a");
|
|
26423
26449
|
try {
|
|
26424
26450
|
const child = spawn6(process.execPath, [process.argv[1] ?? "", "bootstrap", "seed-profile", "--watch"], {
|
|
@@ -26497,7 +26523,7 @@ var BootstrapFinishCommand = class extends M8tCommand {
|
|
|
26497
26523
|
static paths = [["bootstrap", "finish"]];
|
|
26498
26524
|
static usage = Command52.Usage({
|
|
26499
26525
|
description: "Point your local tools at the now-live platform (repo-root marker, discovery cache, next steps).",
|
|
26500
|
-
details: "Final step of `m8t bootstrap` (after the install reaches done). Writes ~/.m8t
|
|
26526
|
+
details: "Final step of `m8t bootstrap` (after the install reaches done). Writes ~/.m8t/repo-root, points your local tools at the live gateway, and \u2014 if you completed the onboarding questionnaire \u2014 seeds your brain-backed advisor's brain with your company profile (best-effort; never blocks finish). Run `m8t bootstrap seed-profile` to seed manually later.",
|
|
26501
26527
|
examples: [["Finish local", "$0 bootstrap finish --repo-root /path/to/m8t"]]
|
|
26502
26528
|
});
|
|
26503
26529
|
repoRoot = Option49.String("--repo-root");
|
|
@@ -26517,7 +26543,7 @@ var BootstrapFinishCommand = class extends M8tCommand {
|
|
|
26517
26543
|
});
|
|
26518
26544
|
}
|
|
26519
26545
|
const repoRoot = (typeof this.repoRoot === "string" ? this.repoRoot : void 0) ?? process.cwd();
|
|
26520
|
-
const markerDir = path34.join(os16.homedir(), ".m8t
|
|
26546
|
+
const markerDir = path34.join(os16.homedir(), ".m8t");
|
|
26521
26547
|
await fs31.mkdir(markerDir, { recursive: true });
|
|
26522
26548
|
await fs31.writeFile(path34.join(markerDir, "repo-root"), `${repoRoot}
|
|
26523
26549
|
`, "utf8");
|
|
@@ -26577,7 +26603,7 @@ var BootstrapFinishCommand = class extends M8tCommand {
|
|
|
26577
26603
|
this.context.stdout.write(renderInstallSummary({ webappUrl, brainOrg }) + "\n");
|
|
26578
26604
|
this.context.stdout.write(
|
|
26579
26605
|
`${colors.field("Optional local tooling for your coding agent:")}
|
|
26580
|
-
\u2022 Talk to your deployed workers from agent sessions (e.g. /stacey) \u2014 install the m8t
|
|
26606
|
+
\u2022 Talk to your deployed workers from agent sessions (e.g. /stacey) \u2014 install the m8t plugin: guides/install/m8t-plugin.md.
|
|
26581
26607
|
\u2022 Azure-capable MCP servers (microsoft/azure-skills, Microsoft Learn) \u2014 see the optional steps in guides/install.md.
|
|
26582
26608
|
\u2022 Deploy workers conversationally with the opt-in persona skills \u2014 see guides/workers.md.
|
|
26583
26609
|
\u2022 Make sure your m8t CLI is current: npm i -g @m8t-stack/cli@latest
|
|
@@ -26836,14 +26862,14 @@ async function installWebDeps(repoRoot) {
|
|
|
26836
26862
|
await runInherit("pnpm", ["install"], repoRoot, "BOOTSTRAP_UI_INSTALL_FAILED");
|
|
26837
26863
|
}
|
|
26838
26864
|
function onboardingUiPaths(home = os17.homedir()) {
|
|
26839
|
-
const dir = path35.join(home, ".m8t
|
|
26865
|
+
const dir = path35.join(home, ".m8t");
|
|
26840
26866
|
return {
|
|
26841
26867
|
logPath: path35.join(dir, "onboarding-ui.log"),
|
|
26842
26868
|
pidPath: path35.join(dir, "onboarding-ui.pid")
|
|
26843
26869
|
};
|
|
26844
26870
|
}
|
|
26845
26871
|
function onboardingRelayPaths(home = os17.homedir()) {
|
|
26846
|
-
const dir = path35.join(home, ".m8t
|
|
26872
|
+
const dir = path35.join(home, ".m8t");
|
|
26847
26873
|
return {
|
|
26848
26874
|
logPath: path35.join(dir, "onboarding-relay.log"),
|
|
26849
26875
|
pidPath: path35.join(dir, "onboarding-relay.pid")
|
|
@@ -27037,7 +27063,7 @@ var BootstrapUiCommand = class extends M8tCommand {
|
|
|
27037
27063
|
if (!state) {
|
|
27038
27064
|
throw new LocalCliError({
|
|
27039
27065
|
code: "BOOTSTRAP_NO_STATE",
|
|
27040
|
-
message: "No bootstrap is in flight (no ~/.m8t
|
|
27066
|
+
message: "No bootstrap is in flight (no ~/.m8t/bootstrap.json).",
|
|
27041
27067
|
hint: "Run 'm8t bootstrap launch --location <region>' first."
|
|
27042
27068
|
});
|
|
27043
27069
|
}
|
|
@@ -27053,8 +27079,8 @@ var BootstrapUiCommand = class extends M8tCommand {
|
|
|
27053
27079
|
this.context.stderr.write(` ${colors.dim(m)}
|
|
27054
27080
|
`);
|
|
27055
27081
|
};
|
|
27056
|
-
if (fs33.existsSync(path36.join(os18.homedir(), ".m8t
|
|
27057
|
-
out(colors.error("\u26A0 an existing ~/.m8t
|
|
27082
|
+
if (fs33.existsSync(path36.join(os18.homedir(), ".m8t", "config.yaml"))) {
|
|
27083
|
+
out(colors.error("\u26A0 an existing ~/.m8t/config.yaml will override the onboarding app registration in apps/web \u2014 if Microsoft sign-in fails, move it aside and retry."));
|
|
27058
27084
|
}
|
|
27059
27085
|
const credential2 = new DefaultAzureCredential20();
|
|
27060
27086
|
const account = await getAzAccount();
|
|
@@ -27177,7 +27203,7 @@ var BootstrapSeedProfileCommand = class extends M8tCommand {
|
|
|
27177
27203
|
credsPath: typeof this.githubAppCreds === "string" ? this.githubAppCreds : void 0
|
|
27178
27204
|
});
|
|
27179
27205
|
if (!ctx) {
|
|
27180
|
-
this.context.stderr.write(` ${colors.dim("no GitHub App creds (~/.m8t
|
|
27206
|
+
this.context.stderr.write(` ${colors.dim("no GitHub App creds (~/.m8t/github-app.json) \u2014 no brain to seed; skipping.")}
|
|
27181
27207
|
`);
|
|
27182
27208
|
return 0;
|
|
27183
27209
|
}
|
|
@@ -27217,7 +27243,7 @@ var BootstrapSeedProfileCommand = class extends M8tCommand {
|
|
|
27217
27243
|
// src/cli.ts
|
|
27218
27244
|
var cli = new Cli({
|
|
27219
27245
|
binaryName: "m8t",
|
|
27220
|
-
binaryLabel: "m8t CLI \u2014 manage m8t
|
|
27246
|
+
binaryLabel: "m8t CLI \u2014 manage m8t deployments",
|
|
27221
27247
|
binaryVersion: CLI_VERSION
|
|
27222
27248
|
});
|
|
27223
27249
|
cli.register(Builtins.HelpCommand);
|