@wairon/cli 5.0.2-dev.13 → 5.0.2-dev.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1260,6 +1260,47 @@ var init_errors = __esm({
1260
1260
  }
1261
1261
  });
1262
1262
 
1263
+ // src/core/statehash.ts
1264
+ function computeStateId() {
1265
+ const tree = {
1266
+ system: loadSystemSpec(),
1267
+ subsystems: loadSubsystemSpecs(),
1268
+ components: loadComponentSpecs(),
1269
+ interfaces: loadInterfaceSpecs(),
1270
+ implementations: loadImplementationSpecs(),
1271
+ types: loadTypeSpecs()
1272
+ };
1273
+ const digest = crypto.createHash("sha256").update(canonicalize(tree)).digest("hex");
1274
+ return { algorithm: "sha256", digest };
1275
+ }
1276
+ function stateIdEquals(a, b) {
1277
+ return !!a && !!b && a.algorithm === b.algorithm && a.digest === b.digest;
1278
+ }
1279
+ function canonicalize(value) {
1280
+ return JSON.stringify(sortKeys(value));
1281
+ }
1282
+ function sortKeys(v) {
1283
+ if (Array.isArray(v)) return v.map(sortKeys);
1284
+ if (v && typeof v === "object") {
1285
+ const src = v;
1286
+ const out = {};
1287
+ for (const k of Object.keys(src).sort()) {
1288
+ if (k === "createdAt" || k === "updatedAt") continue;
1289
+ out[k] = sortKeys(src[k]);
1290
+ }
1291
+ return out;
1292
+ }
1293
+ return v;
1294
+ }
1295
+ var crypto;
1296
+ var init_statehash = __esm({
1297
+ "src/core/statehash.ts"() {
1298
+ "use strict";
1299
+ crypto = __toESM(require("crypto"));
1300
+ init_specs2();
1301
+ }
1302
+ });
1303
+
1263
1304
  // src/core/narrative-labels.ts
1264
1305
  function resolveNarrativeLabels(methodName, steps) {
1265
1306
  const errors = [];
@@ -6824,47 +6865,6 @@ var init_filenames = __esm({
6824
6865
  }
6825
6866
  });
6826
6867
 
6827
- // src/core/statehash.ts
6828
- function computeStateId() {
6829
- const tree = {
6830
- system: loadSystemSpec(),
6831
- subsystems: loadSubsystemSpecs(),
6832
- components: loadComponentSpecs(),
6833
- interfaces: loadInterfaceSpecs(),
6834
- implementations: loadImplementationSpecs(),
6835
- types: loadTypeSpecs()
6836
- };
6837
- const digest = crypto.createHash("sha256").update(canonicalize(tree)).digest("hex");
6838
- return { algorithm: "sha256", digest };
6839
- }
6840
- function stateIdEquals(a, b) {
6841
- return !!a && !!b && a.algorithm === b.algorithm && a.digest === b.digest;
6842
- }
6843
- function canonicalize(value) {
6844
- return JSON.stringify(sortKeys(value));
6845
- }
6846
- function sortKeys(v) {
6847
- if (Array.isArray(v)) return v.map(sortKeys);
6848
- if (v && typeof v === "object") {
6849
- const src = v;
6850
- const out = {};
6851
- for (const k of Object.keys(src).sort()) {
6852
- if (k === "createdAt" || k === "updatedAt") continue;
6853
- out[k] = sortKeys(src[k]);
6854
- }
6855
- return out;
6856
- }
6857
- return v;
6858
- }
6859
- var crypto;
6860
- var init_statehash = __esm({
6861
- "src/core/statehash.ts"() {
6862
- "use strict";
6863
- crypto = __toESM(require("crypto"));
6864
- init_specs2();
6865
- }
6866
- });
6867
-
6868
6868
  // src/core/openapi.ts
6869
6869
  function schemaFor(typeRef, closureIds) {
6870
6870
  const trimmed = typeRef.trim().replace(/^promise\s*<(.+)>$/i, "$1").trim();
@@ -7322,6 +7322,57 @@ function projectOwnSurface(maxAudience) {
7322
7322
  function projectChildSurface() {
7323
7323
  return projectOwnSurface("project");
7324
7324
  }
7325
+ function localName(id) {
7326
+ return id.split("::").pop();
7327
+ }
7328
+ function projectSubsystemSurface(subsystemId) {
7329
+ const system = loadSystemSpec();
7330
+ if (!system) {
7331
+ throw new Error("Cannot project a subsystem surface: the L0 system spec is missing.");
7332
+ }
7333
+ const subsystems = loadSubsystemSpecs();
7334
+ const target = subsystems.find((s) => s.id === subsystemId);
7335
+ if (!target) {
7336
+ throw new Error(`Cannot project a subsystem surface: subsystem "${subsystemId}" does not exist.`);
7337
+ }
7338
+ const components = loadComponentSpecs();
7339
+ const interfaces = loadInterfaceSpecs();
7340
+ const types = loadTypeSpecs();
7341
+ const entries = [];
7342
+ for (const pub of target.publicInterfaces ?? []) {
7343
+ if (!pub.component) continue;
7344
+ const comp = components.find((c) => c.id === pub.component || c.id === `${subsystemId}::${pub.component}`);
7345
+ if (!comp) continue;
7346
+ if (comp.componentType !== "Portal") continue;
7347
+ const compInterfaces = interfaces.filter((i) => i.component === comp.id && (!pub.interface || i.id === pub.interface || i.id === `${subsystemId}::${pub.interface}`));
7348
+ const methods = compInterfaces.flatMap((i) => i.methods);
7349
+ entries.push({
7350
+ id: localName(pub.interface ?? comp.id),
7351
+ name: comp.name,
7352
+ // Family ceiling: a sibling surface is consumable by the system family only.
7353
+ audience: "project",
7354
+ type: pub.type ?? "Custom",
7355
+ // The snapshot carries the LOCAL portal name — consumers resolve cross-tree
7356
+ // refs by their final segment.
7357
+ component: localName(comp.id),
7358
+ methods,
7359
+ ...comp.dispatch && comp.dispatch.length ? { dispatch: comp.dispatch } : {},
7360
+ // Project the backing Portal's auth + basePath so the codec can emit
7361
+ // OpenAPI security + per-portal servers self-contained from the snapshot.
7362
+ ...comp.auth && comp.auth.scheme !== "none" ? { auth: comp.auth } : {},
7363
+ ...comp.basePath ? { basePath: comp.basePath } : {},
7364
+ details: pub.details ?? ""
7365
+ });
7366
+ }
7367
+ return SurfaceSnapshotSchema.parse({
7368
+ projectName: `${system.name}::${subsystemId}`,
7369
+ origin: "generated",
7370
+ stateId: stateIdString(),
7371
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
7372
+ interfaces: entries,
7373
+ types: computeTypeClosure(entries, types)
7374
+ });
7375
+ }
7325
7376
  function listSnapshots(rootDir = getProjectRoot()) {
7326
7377
  const dir = surfacesDir(rootDir);
7327
7378
  if (!fs4.existsSync(dir)) return [];
@@ -7338,18 +7389,37 @@ function listSnapshots(rootDir = getProjectRoot()) {
7338
7389
  function getSnapshot(projectName, rootDir = getProjectRoot()) {
7339
7390
  return listSnapshots(rootDir).find((s) => s.projectName === projectName) ?? null;
7340
7391
  }
7392
+ function snapshotFilename(projectName) {
7393
+ return `${safeFilenamePart(projectName)}.yaml`;
7394
+ }
7341
7395
  function saveSnapshot(snapshot, rootDir = getProjectRoot()) {
7342
7396
  const dir = surfacesDir(rootDir);
7343
7397
  fs4.mkdirSync(dir, { recursive: true });
7344
- const p = path5.join(dir, `${snapshot.projectName}.yaml`);
7398
+ const p = path5.join(dir, snapshotFilename(snapshot.projectName));
7345
7399
  writeYamlFile(p, SurfaceSnapshotSchema.parse(snapshot));
7346
7400
  return p;
7347
7401
  }
7348
7402
  function removeSnapshot(projectName, rootDir = getProjectRoot()) {
7349
- const p = path5.join(surfacesDir(rootDir), `${projectName}.yaml`);
7350
- if (!fs4.existsSync(p)) return false;
7351
- fs4.unlinkSync(p);
7352
- return true;
7403
+ const dir = surfacesDir(rootDir);
7404
+ const direct = path5.join(dir, snapshotFilename(projectName));
7405
+ if (fs4.existsSync(direct)) {
7406
+ fs4.unlinkSync(direct);
7407
+ return true;
7408
+ }
7409
+ if (!fs4.existsSync(dir)) return false;
7410
+ for (const file of fs4.readdirSync(dir)) {
7411
+ if (!file.endsWith(".yaml") && !file.endsWith(".yml")) continue;
7412
+ const p = path5.join(dir, file);
7413
+ try {
7414
+ const snap = SurfaceSnapshotSchema.parse(readYamlFile(p));
7415
+ if (snap.projectName === projectName) {
7416
+ fs4.unlinkSync(p);
7417
+ return true;
7418
+ }
7419
+ } catch {
7420
+ }
7421
+ }
7422
+ return false;
7353
7423
  }
7354
7424
  function loadSurfaceSnapshots() {
7355
7425
  return listSnapshots();
@@ -7420,17 +7490,54 @@ function importSurface(sourcePath, origin) {
7420
7490
  return snapshot;
7421
7491
  }
7422
7492
  function generateChildSnapshots(rootDir = getProjectRoot()) {
7423
- const children = loadSubsystemSpecs().filter((s) => s.projectPath && !s.id.includes("::"));
7493
+ const topLevel = loadSubsystemSpecs().filter((s) => !s.id.includes("::"));
7494
+ const children = topLevel.filter((s) => s.projectPath);
7424
7495
  if (!children.length) return [];
7425
- const snapshot = projectChildSurface();
7496
+ const familySnapshot = projectChildSurface();
7497
+ const siblingSnapshots = /* @__PURE__ */ new Map();
7498
+ const siblingSurface = (subsystemId) => {
7499
+ let snap = siblingSnapshots.get(subsystemId);
7500
+ if (!snap) {
7501
+ snap = projectSubsystemSurface(subsystemId);
7502
+ siblingSnapshots.set(subsystemId, snap);
7503
+ }
7504
+ return snap;
7505
+ };
7426
7506
  const written = [];
7427
7507
  for (const child of children) {
7428
7508
  const childDir = path5.resolve(rootDir, child.projectPath);
7429
7509
  if (!fs4.existsSync(childDir)) continue;
7430
- written.push(saveSnapshot(snapshot, childDir));
7510
+ written.push(saveSnapshot(familySnapshot, childDir));
7511
+ for (const sibling of topLevel) {
7512
+ if (sibling.id === child.id) continue;
7513
+ written.push(saveSnapshot(siblingSurface(sibling.id), childDir));
7514
+ }
7431
7515
  }
7432
7516
  return written;
7433
7517
  }
7518
+ function computeParentStateId(parentRoot) {
7519
+ return computeStateIdAt(parentRoot);
7520
+ }
7521
+ function listExternalInterfaces() {
7522
+ const snapshots = listSnapshots();
7523
+ const chainingParent = resolveChainingParent();
7524
+ const parentStateId = chainingParent ? computeParentStateId(chainingParent.parentRoot) : null;
7525
+ return snapshots.map((snapshot) => {
7526
+ const generated = snapshot.origin === "generated";
7527
+ const sourceKind = !generated ? "foreign" : snapshot.projectName.includes("::") ? "sibling" : "parent";
7528
+ const freshness = generated && parentStateId ? snapshot.stateId === parentStateId ? "fresh" : "stale" : "unverifiable";
7529
+ return {
7530
+ projectName: snapshot.projectName,
7531
+ origin: snapshot.origin,
7532
+ sourceKind,
7533
+ generatedAt: snapshot.generatedAt,
7534
+ ...snapshot.stateId ? { stateId: snapshot.stateId } : {},
7535
+ ...snapshot.version ? { version: snapshot.version } : {},
7536
+ freshness,
7537
+ interfaceIds: snapshot.interfaces.map((e) => e.id)
7538
+ };
7539
+ });
7540
+ }
7434
7541
  function surfaceContentKey(snapshot) {
7435
7542
  const { stateId, generatedAt, origin, ...content } = snapshot;
7436
7543
  return JSON.stringify(content);
@@ -7639,7 +7746,8 @@ var init_contracts = __esm({
7639
7746
  "SURFACE_REF_NOT_EXPOSED",
7640
7747
  `Method "${implMethod.name}" in implementation "${impl.id}" dispatches capability "${step.capability}" through cross-tree portal "${step.targetComponent}" (step ${step.stepNumber}), but the surface snapshot of "${resolved.snapshot.projectName}" does not serve that capability on "${resolved.entry.id}".`,
7641
7748
  impl.id,
7642
- isDraftCtx
7749
+ isDraftCtx,
7750
+ true
7643
7751
  );
7644
7752
  }
7645
7753
  continue;
@@ -7696,7 +7804,8 @@ var init_contracts = __esm({
7696
7804
  "SURFACE_REF_NOT_EXPOSED",
7697
7805
  `Method "${implMethod.name}" in implementation "${impl.id}" calls "${step.targetMethod}" on cross-tree component "${step.targetComponent}" (step ${step.stepNumber}), but the surface snapshot of "${resolved.snapshot.projectName}" does not expose that method on "${resolved.entry.id}".`,
7698
7806
  impl.id,
7699
- isDraftCtx
7807
+ isDraftCtx,
7808
+ true
7700
7809
  );
7701
7810
  } else if (step.assertsGuarantees) {
7702
7811
  const declared = new Set(surfaceMethod.guarantees ?? []);
@@ -7707,7 +7816,8 @@ var init_contracts = __esm({
7707
7816
  "NARRATIVE_SEMANTIC_UNBACKED",
7708
7817
  `Step ${step.stepNumber} of "${implMethod.name}" in implementation "${impl.id}" asserts guarantee "${g}", but the surface snapshot of "${resolved.snapshot.projectName}" does not declare it on "${resolved.entry.id}.${step.targetMethod}".`,
7709
7818
  impl.id,
7710
- isDraftCtx
7819
+ isDraftCtx,
7820
+ true
7711
7821
  );
7712
7822
  }
7713
7823
  }
@@ -9195,7 +9305,8 @@ var init_stereotype_deps = __esm({
9195
9305
  "CROSS_SUBSYSTEM_NON_ADAPTER",
9196
9306
  `Boundary violation: ${comp.componentType} "${comp.id}" depends directly on "${depId}", a surface of project "${resolved.snapshot.projectName}". Only a local client Adapter may cross a project boundary \u2014 route this hop through an Adapter.`,
9197
9307
  comp.id,
9198
- isDraftCtx
9308
+ isDraftCtx,
9309
+ true
9199
9310
  );
9200
9311
  }
9201
9312
  continue;
@@ -12453,9 +12564,15 @@ function buildRuleContext(opts) {
12453
12564
  ...[...SDD_RULES, ...extensions.rules].flatMap((r) => r.codes.map((c) => c.code)),
12454
12565
  // Declarative assertions bring their own namespaced codes — lint.allow
12455
12566
  // and severity overrides treat them exactly like builtins.
12456
- ...extensions.assertions.map((a) => a.fullCode)
12567
+ ...extensions.assertions.map((a) => a.fullCode),
12568
+ // Entry-point emitted codes: validateSddTree's chained-subproject pass
12569
+ // raises these AFTER the rule run (it post-processes the aggregated issue
12570
+ // list), so no registered rule declares them — but lint.allow validation
12571
+ // must still recognize them as real codes.
12572
+ "CHAINED_SUBPROJECT_CONTEXT",
12573
+ "UNVERIFIED_EXTERNAL_REF"
12457
12574
  ]);
12458
- const addIssue = (defaultSeverity, code, message, specId, isDraftContext) => {
12575
+ const addIssue = (defaultSeverity, code, message, specId, isDraftContext, surfaceResolved) => {
12459
12576
  if (scopeSubsystem && specId && !isSpecInScope(specId)) {
12460
12577
  return;
12461
12578
  }
@@ -12473,7 +12590,14 @@ function buildRuleContext(opts) {
12473
12590
  if (severity === "warning") return;
12474
12591
  }
12475
12592
  }
12476
- issues.push({ severity, code, message, specId, ...isDraftContext ? { draftContext: true } : {} });
12593
+ issues.push({
12594
+ severity,
12595
+ code,
12596
+ message,
12597
+ specId,
12598
+ ...isDraftContext ? { draftContext: true } : {},
12599
+ ...surfaceResolved ? { surfaceResolved: true } : {}
12600
+ });
12477
12601
  };
12478
12602
  return {
12479
12603
  system,
@@ -12951,24 +13075,54 @@ function validateSddTree(rulesOrOptions, projectType = "backend") {
12951
13075
  for (const rule of ruleSequence()) {
12952
13076
  rule.check(ctx);
12953
13077
  }
12954
- const hasCrossTreeSuspects = issues.some((i) => SUBPROJECT_LENIENT_CODES.has(i.code));
13078
+ const hasCrossTreeSuspects = issues.some(
13079
+ (i) => SUBPROJECT_REFERENCE_CODES.has(i.code) || SUBPROJECT_CONFORMANCE_CODES.has(i.code)
13080
+ );
12955
13081
  const chainingParent = hasCrossTreeSuspects ? findChainingParent(getProjectRoot()) : null;
12956
13082
  if (chainingParent) {
13083
+ let unverified = 0;
12957
13084
  let downgraded = 0;
12958
- for (const iss of issues) {
12959
- if (!SUBPROJECT_LENIENT_CODES.has(iss.code)) continue;
12960
- if (iss.severity === "error") {
12961
- iss.severity = "warning";
12962
- downgraded++;
13085
+ for (let at = 0; at < issues.length; at++) {
13086
+ const iss = issues[at];
13087
+ if (SUBPROJECT_REFERENCE_CODES.has(iss.code) && !iss.surfaceResolved) {
13088
+ issues[at] = {
13089
+ severity: "warning",
13090
+ code: "UNVERIFIED_EXTERNAL_REF",
13091
+ crossTreeContext: true,
13092
+ // --ci waives it (parent root is authoritative)
13093
+ specId: iss.specId,
13094
+ ...iss.agentId ? { agentId: iss.agentId } : {},
13095
+ ...iss.draftContext ? { draftContext: true } : {},
13096
+ message: `Unverified external reference (${iss.code}): ${iss.message} No vendored surface snapshot covers this reference, so it cannot be verified from this chained subproject standalone \u2014 re-lock the parent so fresh family/sibling snapshots ship, or inspect what this project can consume via \`wairon surface externals\` / sdd_list_external_interfaces.`
13097
+ };
13098
+ unverified++;
13099
+ continue;
13100
+ }
13101
+ if (SUBPROJECT_CONFORMANCE_CODES.has(iss.code)) {
13102
+ if (iss.severity === "error") {
13103
+ iss.severity = "warning";
13104
+ downgraded++;
13105
+ }
13106
+ iss.crossTreeContext = true;
12963
13107
  }
12964
- iss.crossTreeContext = true;
12965
13108
  }
12966
- if (downgraded > 0) {
13109
+ if (unverified > 0 || downgraded > 0) {
13110
+ const notes = [];
13111
+ if (unverified > 0) {
13112
+ notes.push(
13113
+ `${unverified} cross-tree reference(s) have no vendored surface snapshot covering them and were reported as UNVERIFIED_EXTERNAL_REF warnings \u2014 re-lock the parent so fresh family/sibling snapshots ship, or inspect via \`wairon surface externals\` / sdd_list_external_interfaces.`
13114
+ );
13115
+ }
13116
+ if (downgraded > 0) {
13117
+ notes.push(
13118
+ `${downgraded} code\u2194spec conformance finding(s) (parent-root-relative source paths) were downgraded to warnings.`
13119
+ );
13120
+ }
12967
13121
  issues.unshift({
12968
13122
  severity: "warning",
12969
13123
  code: "CHAINED_SUBPROJECT_CONTEXT",
12970
13124
  crossTreeContext: true,
12971
- message: `This project is a chained subproject ("${chainingParent.subsystemId}") of the parent project at "${chainingParent.parentRoot}". ${downgraded} reference(s) resolve only in the parent tree (shared types, sibling subsystems, or cross-tree components that live above this root) and were downgraded to warnings \u2014 validating a subproject standalone cannot verify them. Run validation from the parent root for full cross-tree verification.`
13125
+ message: `This project is a chained subproject ("${chainingParent.subsystemId}") of the parent project at "${chainingParent.parentRoot}". ${notes.join(" ")} Full cross-tree verification runs from the parent root.`
12972
13126
  });
12973
13127
  }
12974
13128
  }
@@ -12985,7 +13139,7 @@ function validateSddTree(rulesOrOptions, projectType = "backend") {
12985
13139
  function validateAsComplete(options) {
12986
13140
  return validateSddTree({ ...options ?? {}, treatAllAsComplete: true });
12987
13141
  }
12988
- var SUBPROJECT_LENIENT_CODES;
13142
+ var SUBPROJECT_REFERENCE_CODES, SUBPROJECT_CONFORMANCE_CODES;
12989
13143
  var init_validation = __esm({
12990
13144
  "src/core/validation.ts"() {
12991
13145
  "use strict";
@@ -12998,8 +13152,7 @@ var init_validation = __esm({
12998
13152
  init_source_analysis();
12999
13153
  init_specs2();
13000
13154
  init_fs();
13001
- SUBPROJECT_LENIENT_CODES = /* @__PURE__ */ new Set([
13002
- // reference resolution
13155
+ SUBPROJECT_REFERENCE_CODES = /* @__PURE__ */ new Set([
13003
13156
  "UNDEFINED_TYPE_REFERENCE",
13004
13157
  "INVALID_DEPENDENCY_REFERENCE",
13005
13158
  "INVALID_TARGET_COMPONENT_REFERENCE",
@@ -13007,8 +13160,9 @@ var init_validation = __esm({
13007
13160
  "UNDECLARED_DEPENDENCY_CALL",
13008
13161
  "INVALID_TRUSTED_LINK",
13009
13162
  "CROSS_SUBSYSTEM_NON_ADAPTER",
13010
- "CROSS_TREE_REF_UNRESOLVED",
13011
- // code↔spec conformance (root-relative sourcePaths / import graph)
13163
+ "CROSS_TREE_REF_UNRESOLVED"
13164
+ ]);
13165
+ SUBPROJECT_CONFORMANCE_CODES = /* @__PURE__ */ new Set([
13012
13166
  "MISSING_SOURCE_FILE",
13013
13167
  "SOURCE_PATH_ESCAPES_ROOT",
13014
13168
  "MISSING_SOURCE_PATH",
@@ -13931,6 +14085,19 @@ function dryRunSerializeSpecs(include) {
13931
14085
  function buildProjectGraph(level) {
13932
14086
  return buildGraphModel(level);
13933
14087
  }
14088
+ function resolveChainingParent() {
14089
+ return findChainingParent(getProjectRoot());
14090
+ }
14091
+ function computeStateIdAt(root) {
14092
+ const resolved = path10.resolve(root);
14093
+ return runWithProjectRoot(resolved, () => {
14094
+ workspaceFor(resolved).invalidate();
14095
+ const system = loadSystemSpec();
14096
+ if (!system) return null;
14097
+ const s = computeStateId();
14098
+ return `${s.algorithm}:${s.digest}`;
14099
+ });
14100
+ }
13934
14101
  function deleteTypeSpec(id) {
13935
14102
  return current().deleteTypeSpec(id);
13936
14103
  }
@@ -13974,6 +14141,7 @@ var init_specs2 = __esm({
13974
14141
  path10 = __toESM(require("path"));
13975
14142
  init_loader();
13976
14143
  init_fs();
14144
+ init_statehash();
13977
14145
  init_yaml();
13978
14146
  init_models();
13979
14147
  init_narrative_labels();
@@ -16138,7 +16306,9 @@ __export(src_exports, {
16138
16306
  clearLoaderIssues: () => clearLoaderIssues,
16139
16307
  collectPromotableSpecs: () => collectPromotableSpecs,
16140
16308
  composeRuleSequence: () => composeRuleSequence,
16309
+ computeParentStateId: () => computeParentStateId,
16141
16310
  computeStateId: () => computeStateId,
16311
+ computeStateIdAt: () => computeStateIdAt,
16142
16312
  contextDir: () => contextDir,
16143
16313
  createAgentRecord: () => createAgentRecord,
16144
16314
  createChainedSubsystem: () => createChainedSubsystem,
@@ -16204,6 +16374,7 @@ __export(src_exports, {
16204
16374
  isOpenApiDocument: () => isOpenApiDocument,
16205
16375
  isProjectInitialized: () => isProjectInitialized,
16206
16376
  listDirectChainedSubprojects: () => listDirectChainedSubprojects,
16377
+ listExternalInterfaces: () => listExternalInterfaces,
16207
16378
  listFiles: () => listFiles,
16208
16379
  listFilesRecursive: () => listFilesRecursive,
16209
16380
  listFreeStandingDomains: () => listFreeStandingDomains,
@@ -16249,6 +16420,7 @@ __export(src_exports, {
16249
16420
  pathExists: () => pathExists,
16250
16421
  projectChildSurface: () => projectChildSurface,
16251
16422
  projectOwnSurface: () => projectOwnSurface,
16423
+ projectSubsystemSurface: () => projectSubsystemSurface,
16252
16424
  promoteAllComplete: () => promoteAllComplete,
16253
16425
  provisionProject: () => provisionProject,
16254
16426
  readArchitectureContext: () => readArchitectureContext,
@@ -16268,6 +16440,7 @@ __export(src_exports, {
16268
16440
  renderTemplateInstructions: () => renderTemplateInstructions,
16269
16441
  renderWaironGuide: () => renderWaironGuide,
16270
16442
  resolveAgentTopology: () => resolveAgentTopology,
16443
+ resolveChainingParent: () => resolveChainingParent,
16271
16444
  resolveDomains: () => resolveDomains,
16272
16445
  resolvePackRef: () => resolvePackRef,
16273
16446
  resolveSubprojectForNamespace: () => resolveSubprojectForNamespace,
@@ -16331,7 +16504,7 @@ function defaultTargetConfig(type) {
16331
16504
  enabled: true
16332
16505
  };
16333
16506
  }
16334
- var WAIRON_VERSION = "5.0.2-dev.13";
16507
+ var WAIRON_VERSION = "5.0.2-dev.14";
16335
16508
  var GITHUB_REPO = "SYW-Apps/Waffle-AIron";
16336
16509
  var ARCHITECT_AGENT_ID = "agent-architect";
16337
16510
  var ARCHITECT_TEMPLATE_ID = "architect";
@@ -17725,7 +17898,9 @@ init_yaml();
17725
17898
  clearLoaderIssues,
17726
17899
  collectPromotableSpecs,
17727
17900
  composeRuleSequence,
17901
+ computeParentStateId,
17728
17902
  computeStateId,
17903
+ computeStateIdAt,
17729
17904
  contextDir,
17730
17905
  createAgentRecord,
17731
17906
  createChainedSubsystem,
@@ -17791,6 +17966,7 @@ init_yaml();
17791
17966
  isOpenApiDocument,
17792
17967
  isProjectInitialized,
17793
17968
  listDirectChainedSubprojects,
17969
+ listExternalInterfaces,
17794
17970
  listFiles,
17795
17971
  listFilesRecursive,
17796
17972
  listFreeStandingDomains,
@@ -17836,6 +18012,7 @@ init_yaml();
17836
18012
  pathExists,
17837
18013
  projectChildSurface,
17838
18014
  projectOwnSurface,
18015
+ projectSubsystemSurface,
17839
18016
  promoteAllComplete,
17840
18017
  provisionProject,
17841
18018
  readArchitectureContext,
@@ -17855,6 +18032,7 @@ init_yaml();
17855
18032
  renderTemplateInstructions,
17856
18033
  renderWaironGuide,
17857
18034
  resolveAgentTopology,
18035
+ resolveChainingParent,
17858
18036
  resolveDomains,
17859
18037
  resolvePackRef,
17860
18038
  resolveSubprojectForNamespace,