@moda-ai/cli 1.55.79 → 1.55.81

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.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-w5en52xc.js";
3
+ } from "./cli-mmskch5x.js";
4
4
  import"./cli-rrggdmf8.js";
5
- import"./cli-m82f9yqj.js";
5
+ import"./cli-w3273wfb.js";
6
6
  import"./cli-mm48br00.js";
7
7
  import {
8
8
  readHarnessSyncState
@@ -95,7 +95,7 @@ async function buildAgentContext(context) {
95
95
  const graph = readHarnessGraphIfPresent(context.cwd);
96
96
  const reportState = readHarnessReportState(context.cwd);
97
97
  const syncState = readHarnessSyncState(context.cwd);
98
- const harness = graph ? await import("./harness-dbkbs04z.js") : undefined;
98
+ const harness = graph ? await import("./harness-fp6whmxb.js") : undefined;
99
99
  const topFindings = doctor.checks.filter((check) => check.status === "fail" || check.status === "warning").slice(0, 12).map(checkToFinding);
100
100
  const evidenceRefs = [
101
101
  ...doctor.checks.map(checkToEvidenceRef),
@@ -18923,6 +18923,7 @@ var HARNESS_FAMILY_FLAGS = [
18923
18923
  "analyst-model",
18924
18924
  "assist",
18925
18925
  "concern",
18926
+ "deterministic-floor",
18926
18927
  "dry-run",
18927
18928
  "experimental",
18928
18929
  "from",
@@ -18937,6 +18938,7 @@ var HARNESS_FAMILY_FLAGS = [
18937
18938
  "path",
18938
18939
  "promote",
18939
18940
  "remote",
18941
+ "repair",
18940
18942
  "report",
18941
18943
  "run",
18942
18944
  "run-id",
@@ -19222,7 +19224,7 @@ async function runHarnessCommand(context) {
19222
19224
  throw new CliInputError("Focused remote prompt analysis is not supported yet.", "Use local --analyst=claude|codex|cursor|local-scan, or drop --concern for a full remote report.");
19223
19225
  }
19224
19226
  if (context.flags["github-actions"] === "true") {
19225
- const { runGithubActionsAnalyze } = await import("./harness-github-actions-amef13q6.js");
19227
+ const { runGithubActionsAnalyze } = await import("./harness-github-actions-51v5jbtn.js");
19226
19228
  const result = await runGithubActionsAnalyze(rootDir, {
19227
19229
  writeReport: (report2) => {
19228
19230
  const normalized = normalizeHarnessReport(report2);
@@ -19261,7 +19263,12 @@ async function runHarnessCommand(context) {
19261
19263
  elapsed_ms: Date.now() - context.startedAt
19262
19264
  });
19263
19265
  writeHumanProgress(context, "Moda Analyst: inventorying local harness files...");
19264
- const graph = scanHarness({
19266
+ const graph = context.flags["deterministic-floor"] === "true" ? await deterministicFloorGraph(rootDir, {
19267
+ dryRun: context.dryRun,
19268
+ tenantId: tenant?.tenantId,
19269
+ tenantSource: tenant?.source,
19270
+ pathWasExplicit: context.flags.path !== undefined
19271
+ }) : scanHarness({
19265
19272
  rootDir,
19266
19273
  dryRun: context.dryRun,
19267
19274
  tenantId: tenant?.tenantId,
@@ -19316,7 +19323,7 @@ async function runHarnessCommand(context) {
19316
19323
  }
19317
19324
  case "validate-report": {
19318
19325
  const reportPath = resolveHarnessReportPath(rootDir, context.positionals[1] ?? context.flags.report);
19319
- const report = readHarnessReport(reportPath);
19326
+ const report = context.flags.repair === "true" ? repairExternalAnalystReport(JSON.parse(readFileSync12(reportPath, "utf8")), rootDir) : readHarnessReport(reportPath);
19320
19327
  const validation = validateHarnessReport(report, rootDir, {
19321
19328
  deterministicFloor: computeDeterministicFloor(rootDir)
19322
19329
  });
@@ -19368,8 +19375,8 @@ async function runHarnessCommand(context) {
19368
19375
  }
19369
19376
  const { artifacts, unknowns } = deterministicGraphItems(rootDir, promote === "all" ? undefined : promote);
19370
19377
  tagComponentStatus({ runtimeAgents: [], artifacts }, rootDir);
19371
- const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-4jaj5eyb.js");
19372
- const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-0w2wddj1.js");
19378
+ const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-yax78wy5.js");
19379
+ const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-ejy18zzk.js");
19373
19380
  let components = { runtimeAgents: [], artifacts: [], warnings: [] };
19374
19381
  if (promote === "all" || promote === "topology" || promote === "tools") {
19375
19382
  const { result, ctx } = extractHarnessWithContext2(rootDir);
@@ -19403,8 +19410,8 @@ async function runHarnessCommand(context) {
19403
19410
  }
19404
19411
  case "extract": {
19405
19412
  writeHumanProgress(context, "Harness extract: tracing model call sites (no LLM, no network)...");
19406
- const { extractHarnessWithContext: extractHarnessWithContext2, serializeExtractResult } = await import("./index-4jaj5eyb.js");
19407
- const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-0w2wddj1.js");
19413
+ const { extractHarnessWithContext: extractHarnessWithContext2, serializeExtractResult } = await import("./index-yax78wy5.js");
19414
+ const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-ejy18zzk.js");
19408
19415
  const { result, ctx } = extractHarnessWithContext2(rootDir, { fresh: true });
19409
19416
  const artifacts = deterministicArtifacts(rootDir);
19410
19417
  tagComponentStatus({ runtimeAgents: [], artifacts }, rootDir);
@@ -20119,6 +20126,7 @@ function removeArtifacts(report, ids) {
20119
20126
  }
20120
20127
  function repairExternalAnalystReport(report, rootDir, options = {}) {
20121
20128
  const normalized = normalizeHarnessReport(report);
20129
+ normalized.graph.artifacts = normalized.graph.artifacts.filter((artifact) => !(/^__(?:END|BEGIN|START)__$/i.test(artifact.id) && artifact.type === "unknown" && artifact.name === artifact.id && artifact.scope === "shared" && artifact.confidence === 0.5 && artifact.usedByAgentIds?.length === 0 && Object.keys(artifact).every((key) => ["id", "type", "name", "scope", "confidence", "usedByAgentIds"].includes(key))));
20122
20130
  repairCitationLines(normalized, rootDir);
20123
20131
  mergeDeterministicReplacement(normalized, rootDir, options);
20124
20132
  if (!options.concern || options.concern === "topology")
@@ -20281,6 +20289,30 @@ var CONCERN_PROMOTED_ARTIFACT_TYPES = {
20281
20289
  prompts: new Set(["prompt"]),
20282
20290
  evals: new Set(["model_config", "eval"])
20283
20291
  };
20292
+ async function deterministicFloorGraph(rootDir, options = {}) {
20293
+ const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-yax78wy5.js");
20294
+ const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-ejy18zzk.js");
20295
+ const { result, ctx } = extractHarnessWithContext2(rootDir);
20296
+ const items = deterministicGraphItems(rootDir);
20297
+ const components = mergeEnumeratedComponents(items.artifacts, enumerateHarnessComponents(result, ctx));
20298
+ const metadata = scanHarness({ ...options, rootDir });
20299
+ const graph = {
20300
+ ...metadata,
20301
+ agentFamilies: [],
20302
+ runtimeAgents: components.runtimeAgents,
20303
+ artifacts: components.artifacts,
20304
+ relationships: [],
20305
+ unknowns: items.unknowns,
20306
+ channelAdapters: [],
20307
+ identityNamespaces: [],
20308
+ deployments: []
20309
+ };
20310
+ hydratePromptAndToolBodies(graph, rootDir);
20311
+ tagComponentStatus(graph, rootDir);
20312
+ deriveRelationshipsFromGraph(graph);
20313
+ enrichScanCaptureMetadata(graph);
20314
+ return graph;
20315
+ }
20284
20316
  function deterministicArtifacts(rootDir, concern) {
20285
20317
  return deterministicGraphItems(rootDir, concern).artifacts;
20286
20318
  }
@@ -25946,6 +25978,8 @@ function promoteAll(report, rootDir) {
25946
25978
  let artifact;
25947
25979
  switch (candidate.kind) {
25948
25980
  case "tool_definition":
25981
+ if (FIXTURE_DIR2.test(candidate.path) || isTestInput(candidate.path))
25982
+ break;
25949
25983
  artifact = promoteToolCandidate(candidate, rootDir, confidence2, fileCache);
25950
25984
  break;
25951
25985
  case "prompt_file":
@@ -27607,7 +27641,7 @@ function toolNamesOf(tree) {
27607
27641
  visit2(child, false, spread);
27608
27642
  spread.forEach(set);
27609
27643
  } else if (child.key) {
27610
- set({ name: child.key, path: child.path, line: child.line, via: "key" });
27644
+ set({ name: child.key, path: child.path, line: child.line, start: child.start, via: "key" });
27611
27645
  }
27612
27646
  }
27613
27647
  names.push(...record.values());
@@ -27665,6 +27699,7 @@ function emitTools(result, ctx, options = {}) {
27665
27699
  const packageOf = workspacePackages(ctx.rootDir);
27666
27700
  const found = new Map;
27667
27701
  const ownersByTool = new Map;
27702
+ const recordSpans = new Map;
27668
27703
  let definitionBytes = 0;
27669
27704
  const limit = () => {
27670
27705
  const warning = "tools: bounded tool catalog budget reached; some evidence or bodies omitted";
@@ -27690,9 +27725,14 @@ function emitTools(result, ctx, options = {}) {
27690
27725
  found.set(key, tool);
27691
27726
  ownersByTool.set(key, { direct: [], rpc: [], open: [] });
27692
27727
  }
27728
+ if (evidence.start !== undefined && evidence.end !== undefined && /^(?:tools record key|tool stored under this key)$/.test(evidence.reason)) {
27729
+ const spans = recordSpans.get(tool) ?? [];
27730
+ spans.push({ path: evidence.path, start: evidence.start, end: evidence.end });
27731
+ recordSpans.set(tool, spans);
27732
+ }
27693
27733
  if (enumerationRepository(ctx).status(evidence.path) !== "defined_only")
27694
27734
  tool.status = "reachable";
27695
- if (tool.evidence.length < MAX_EVIDENCE_PER_TOOL && !tool.evidence.some((other) => other.path === evidence.path && other.line === evidence.line)) {
27735
+ if (tool.evidence.length < MAX_EVIDENCE_PER_TOOL && !tool.evidence.some((other) => other.path === evidence.path && other.line === evidence.line && other.start === evidence.start && other.end === evidence.end)) {
27696
27736
  tool.evidence.push(evidence);
27697
27737
  tool.calledFrom.push({ path: evidence.path, line: evidence.line, ...enclosing ? { enclosing } : {} });
27698
27738
  }
@@ -27731,7 +27771,7 @@ function emitTools(result, ctx, options = {}) {
27731
27771
  const checker = program.getTypeChecker();
27732
27772
  const tracer = tracerFor(program);
27733
27773
  const names = (expression) => literalStrings(expression, tracer).slice(0, MAX_NAMES_PER_SITE);
27734
- const at = (node, reason) => ({ path: rel2, line: lineOf(node), reason });
27774
+ const at = (node, reason) => ({ path: rel2, line: lineOf(node), reason, start: node.getStart(), end: node.getEnd() });
27735
27775
  const visitObject = (object) => {
27736
27776
  const keys = object.properties.map((property) => propertyNameText(property.name) ?? "");
27737
27777
  const nameExpr = propertyValue(object, "name");
@@ -27761,9 +27801,10 @@ function emitTools(result, ctx, options = {}) {
27761
27801
  continue;
27762
27802
  const agents = owners.ownersOf(property, program);
27763
27803
  const options2 = toolOptions(property.initializer);
27764
- const definition = definitionNode(property.initializer, checker);
27804
+ const definitions = definitionNodes(property.initializer, checker);
27765
27805
  for (const name of list)
27766
- add(name, "record", at(property, "tools record key"), agents, definition, options2 ? displayNameOf(options2, tracer) : undefined, enclosingName(property));
27806
+ for (const definition of definitions)
27807
+ add(name, "record", at(property, "tools record key"), agents, definition, options2 ? displayNameOf(options2, tracer) : undefined, enclosingName(property));
27767
27808
  }
27768
27809
  };
27769
27810
  const visit2 = (node) => {
@@ -27775,9 +27816,10 @@ function emitTools(result, ctx, options = {}) {
27775
27816
  if (list.length > 0) {
27776
27817
  const agents = owners.ownersOf(node, program);
27777
27818
  const options2 = toolOptions(node.right);
27778
- const definition = definitionNode(node.right, checker);
27819
+ const definitions = definitionNodes(node.right, checker);
27779
27820
  for (const name of list)
27780
- add(name, "record", at(node, "tool stored under this key"), agents, definition, options2 ? displayNameOf(options2, tracer) : undefined, enclosingName(node));
27821
+ for (const definition of definitions)
27822
+ add(name, "record", at(node, "tool stored under this key"), agents, definition, options2 ? displayNameOf(options2, tracer) : undefined, enclosingName(node));
27781
27823
  }
27782
27824
  }
27783
27825
  } catch {}
@@ -27796,6 +27838,15 @@ function emitTools(result, ctx, options = {}) {
27796
27838
  const local = candidates.filter((tool) => (tool.package ?? "") === packageOf(path));
27797
27839
  return local.length === 1 ? local[0] : candidates.length === 1 ? candidates[0] : undefined;
27798
27840
  };
27841
+ const targetsForHit = (name, path, start) => {
27842
+ const offered = [...found.values()].filter((tool) => tool.name === name && tool.surface).flatMap((tool) => (recordSpans.get(tool) ?? []).filter((entry) => entry.path === path && start !== undefined && entry.start !== undefined && entry.end !== undefined && entry.start <= start && start < entry.end).map((entry) => ({ tool, width: entry.end - entry.start })));
27843
+ if (offered.length > 0) {
27844
+ const nearest = Math.min(...offered.map((entry) => entry.width));
27845
+ return [...new Set(offered.filter((entry) => entry.width === nearest).map((entry) => entry.tool))];
27846
+ }
27847
+ const target = targetFor(name, path);
27848
+ return target ? [target] : [];
27849
+ };
27799
27850
  for (const role of result.roles) {
27800
27851
  if (role.role !== "tools" || role.sink.isTest || skipPath(role.sink.path))
27801
27852
  continue;
@@ -27804,9 +27855,11 @@ function emitTools(result, ctx, options = {}) {
27804
27855
  for (const hit of toolNamesOf(role.tree).names) {
27805
27856
  if (skipPath(hit.path))
27806
27857
  continue;
27807
- const target = targetFor(hit.name, hit.path);
27808
- const ambiguous = !target && [...found.values()].some((tool) => tool.name === hit.name && tool.surface);
27809
- add(hit.name, "tools-arg", { path: hit.path, line: hit.line, reason: `named in the tools argument of ${role.sink.callee} at ${role.sink.path}:${role.sink.line}` }, ambiguous ? { direct: [], rpc: [], open: [] } : siteOwners, undefined, undefined, role.sink.enclosing, target?.surface);
27858
+ const targets = targetsForHit(hit.name, hit.path, hit.start);
27859
+ const ambiguous = targets.length === 0 && [...found.values()].some((tool) => tool.name === hit.name && tool.surface);
27860
+ for (const target of targets.length > 0 ? targets : [undefined]) {
27861
+ add(hit.name, "tools-arg", { path: hit.path, line: hit.line, reason: `named in the tools argument of ${role.sink.callee} at ${role.sink.path}:${role.sink.line}` }, ambiguous ? { direct: [], rpc: [], open: [] } : siteOwners, undefined, undefined, role.sink.enclosing, target?.surface);
27862
+ }
27810
27863
  }
27811
27864
  }
27812
27865
  joinSurfaces(found, ownersByTool);
@@ -27823,7 +27876,10 @@ function emitTools(result, ctx, options = {}) {
27823
27876
  let owners2 = callOwners.get(hit.name);
27824
27877
  if (!owners2)
27825
27878
  callOwners.set(hit.name, owners2 = []);
27826
- owners2.push({ pkg: packageOf(hit.path), surface: surfaceOf(hit.path, packageOf(hit.path)), ids });
27879
+ const targets = targetsForHit(hit.name, hit.path, hit.start);
27880
+ for (const surface of targets.length > 0 ? targets.map((tool) => tool.surface) : [surfaceOf(hit.path, packageOf(hit.path))]) {
27881
+ owners2.push({ pkg: packageOf(hit.path), surface, ids });
27882
+ }
27827
27883
  }
27828
27884
  }
27829
27885
  for (const [key, tool] of found) {
@@ -27997,8 +28053,48 @@ function isSchemaProperty(object) {
27997
28053
  const holder = parent.parent;
27998
28054
  return import_typescript12.default.isObjectLiteralExpression(holder) && import_typescript12.default.isPropertyAssignment(holder.parent) && propertyNameText(holder.parent.name) === "properties";
27999
28055
  }
28056
+ function executeToolFactories(expression, checker) {
28057
+ const value = unwrap(expression);
28058
+ if (!import_typescript12.default.isPropertyAccessExpression(value) || value.name.text !== "tool")
28059
+ return [];
28060
+ const find = (node, seen, depth) => {
28061
+ const current = unwrap(node);
28062
+ if (depth > 6 || seen.has(current))
28063
+ return [];
28064
+ seen.add(current);
28065
+ if (import_typescript12.default.isIdentifier(current)) {
28066
+ const declaration = valueDeclaration(resolvedSymbol(current, checker));
28067
+ if (declaration && import_typescript12.default.isVariableDeclaration(declaration) && declaration.initializer && declaration.parent.flags & import_typescript12.default.NodeFlags.Const) {
28068
+ return find(declaration.initializer, seen, depth + 1);
28069
+ }
28070
+ }
28071
+ if (import_typescript12.default.isConditionalExpression(current))
28072
+ return [...find(current.whenTrue, new Set(seen), depth + 1), ...find(current.whenFalse, new Set(seen), depth + 1)];
28073
+ if (import_typescript12.default.isCallExpression(current) && import_typescript12.default.isIdentifier(current.expression)) {
28074
+ const origin = importOrigin(current.expression, checker);
28075
+ if (origin?.imported === "createExecuteRuntime" && origin.module === "@cloudflare/think/tools/execute")
28076
+ return [current];
28077
+ }
28078
+ return [];
28079
+ };
28080
+ return [...new Set(find(value.expression, new Set, 0))];
28081
+ }
28082
+ function definitionNodes(expression, checker, depth = 0) {
28083
+ const value = unwrap(expression);
28084
+ const factories = executeToolFactories(value, checker);
28085
+ if (factories.length > 0)
28086
+ return factories;
28087
+ if (import_typescript12.default.isIdentifier(value) && depth < 2) {
28088
+ const declaration = valueDeclaration(resolvedSymbol(value, checker));
28089
+ if (declaration && import_typescript12.default.isVariableDeclaration(declaration) && declaration.initializer)
28090
+ return definitionNodes(declaration.initializer, checker, depth + 1);
28091
+ }
28092
+ return [definitionNode(value, checker)];
28093
+ }
28000
28094
  function isToolValue(expression, checker, depth = 0) {
28001
28095
  const value = unwrap(expression);
28096
+ if (executeToolFactories(value, checker).length > 0)
28097
+ return true;
28002
28098
  if (import_typescript12.default.isCallExpression(value)) {
28003
28099
  const callee = unwrap(value.expression);
28004
28100
  const name = import_typescript12.default.isIdentifier(callee) ? callee : import_typescript12.default.isPropertyAccessExpression(callee) ? callee.name : undefined;
@@ -29285,6 +29381,50 @@ function inheritedTrue(node, propertyName2, checker, seen = new Set) {
29285
29381
  }
29286
29382
  return false;
29287
29383
  }
29384
+ function hasSkillSources(node, checker, seen = new Set) {
29385
+ if (seen.has(node))
29386
+ return false;
29387
+ seen.add(node);
29388
+ const member2 = node.members.find((member3) => nameOf(member3.name) === "getSkills" && !(import_typescript16.default.getCombinedModifierFlags(member3) & import_typescript16.default.ModifierFlags.Static));
29389
+ if (member2) {
29390
+ const hook = import_typescript16.default.isMethodDeclaration(member2) ? member2 : import_typescript16.default.isPropertyDeclaration(member2) && member2.initializer && (import_typescript16.default.isArrowFunction(unwrap(member2.initializer)) || import_typescript16.default.isFunctionExpression(unwrap(member2.initializer))) ? unwrap(member2.initializer) : undefined;
29391
+ if (!hook?.body)
29392
+ return false;
29393
+ const enabled = (expression, visited = new Set, depth = 0) => {
29394
+ const value = unwrap(expression);
29395
+ if (visited.has(value) || depth > 8)
29396
+ return false;
29397
+ visited.add(value);
29398
+ if (import_typescript16.default.isConditionalExpression(value))
29399
+ return enabled(value.whenTrue, new Set(visited), depth + 1) || enabled(value.whenFalse, new Set(visited), depth + 1);
29400
+ if (checker && (import_typescript16.default.isIdentifier(value) || import_typescript16.default.isPropertyAccessExpression(value))) {
29401
+ const declaration = valueDeclaration(resolvedSymbol(import_typescript16.default.isPropertyAccessExpression(value) ? value.name : value, checker));
29402
+ if (declaration && import_typescript16.default.isVariableDeclaration(declaration) && declaration.initializer && declaration.parent.flags & import_typescript16.default.NodeFlags.Const) {
29403
+ let populated = false;
29404
+ const symbol = resolvedSymbol(declaration.name, checker);
29405
+ const scan = (node2) => {
29406
+ if (import_typescript16.default.isCallExpression(node2) && import_typescript16.default.isPropertyAccessExpression(node2.expression) && ["push", "unshift", "splice"].includes(node2.expression.name.text) && resolvedSymbol(node2.expression.expression, checker) === symbol && node2.arguments.length > (node2.expression.name.text === "splice" ? 2 : 0))
29407
+ populated = true;
29408
+ if (import_typescript16.default.isBinaryExpression(node2) && node2.operatorToken.kind === import_typescript16.default.SyntaxKind.EqualsToken && import_typescript16.default.isElementAccessExpression(node2.left) && resolvedSymbol(node2.left.expression, checker) === symbol)
29409
+ populated = true;
29410
+ import_typescript16.default.forEachChild(node2, scan);
29411
+ };
29412
+ scan(declaration.getSourceFile());
29413
+ return populated || enabled(declaration.initializer, visited, depth + 1);
29414
+ }
29415
+ }
29416
+ return value.kind !== import_typescript16.default.SyntaxKind.NullKeyword && value.getText() !== "undefined" && (!import_typescript16.default.isArrayLiteralExpression(value) || value.elements.length > 0);
29417
+ };
29418
+ return returnExpressions(hook).some((expression) => enabled(expression));
29419
+ }
29420
+ if (checker)
29421
+ for (const base of node.heritageClauses?.flatMap((h) => h.types) ?? []) {
29422
+ const declaration = valueDeclaration(resolvedSymbol(base.expression, checker));
29423
+ if (declaration && (import_typescript16.default.isClassDeclaration(declaration) || import_typescript16.default.isClassExpression(declaration)) && hasSkillSources(declaration, checker, seen))
29424
+ return true;
29425
+ }
29426
+ return false;
29427
+ }
29288
29428
  function enumerateToolCatalog(result, ctx) {
29289
29429
  const output = emptyResult(), repo = enumerationRepository(ctx), agents = enumerateAgents(result, ctx);
29290
29430
  const agentByName = new Map(agents.runtimeAgents.map((entry) => [entry.name, entry.id]));
@@ -29348,6 +29488,8 @@ function enumerateToolCatalog(result, ctx) {
29348
29488
  const names = [...THINK_WORKSPACE_TOOLS];
29349
29489
  if (inheritedTrue(node, "workspaceBash", checker))
29350
29490
  names.push("bash");
29491
+ if (hasSkillSources(node, checker))
29492
+ names.push("read_skill_resource");
29351
29493
  for (const name of names)
29352
29494
  add(name, file, node, "think", "Think workspace tool inherited by this concrete agent", owners2);
29353
29495
  }
@@ -29508,4 +29650,4 @@ function mergeEnumeratedComponents(artifacts, components) {
29508
29650
  return { runtimeAgents, artifacts: output };
29509
29651
  }
29510
29652
 
29511
- export { startRemoteAnalyze, pollRemoteAnalyzeUntilDone, isRecoverableRemoteRun, checkPromptMapping, safePromptEvidencePath, discoverHarnessPromptSources, valueChildren, selectKey, allValues, renderings, CALL_SINKS, registerCallSink, registerClassSink, isModelId, collectModels, modelArtifacts, modelUnknowns, collectModelLiterals, agentForScope, createAgentScopeResolver, enumerateAgents, toolNamesOf, EXTRACT_SCHEMA_VERSION, enumerateWorkflows, enumerateToolCatalog, ENUMERATORS, enumerateHarnessComponents, mergeEnumeratedComponents, clearExtractCache, extractHarness, extractHarnessWithContext, scopeOf, serializeExtractResult, runEnumerators, assignAgentIds, runHarnessCommand, writeHarnessAnalyzeResult, emitWrittenArtifacts, analyzeHarnessPrompts, isToolGroupPlaceholder, deterministicOnlyArtifactTypes, repairExternalAnalystReport, deriveRelationshipsFromGraph, deterministicArtifacts, deterministicGraphItems, mergeDeterministicArtifacts, analystRefutations, describeCodingAgentEvent, analystEventProgress, isRetryableExternalAnalystFailure, sleep, summarizeInvalidAnalystReport, isDeterministicLocalAnalyst, resolveHarnessAnalyzeConcern, resolveExternalHarnessAnalystInvocation, detectAvailableCodingAgents, codingAgentDisplayName, runCodingAgent, readOnlyClaudeExtraArgs, resolveAnalystModel, renderExternalHarnessAnalystPrompt, CONCERN_CANDIDATE_KINDS, SEED_CANDIDATE_KIND_LABELS, renderAnalystCandidateLines, renderAnalystSeedLines, truncateText, scanHarness, summarizeHarness, buildSourceSnapshot, writeHumanProgress, describeSyncIdentity, describeSyncTenantLabel, findFresherHarnessReports, writeHarnessArtifacts, assertHarnessGraphSyncQuality, graphForSync, inventoryFiles, numericEnv, numericEnvAllowZero, computeDeterministicFloor, stableId, titleFromId, promptNameFromPath };
29653
+ export { startRemoteAnalyze, pollRemoteAnalyzeUntilDone, isRecoverableRemoteRun, checkPromptMapping, safePromptEvidencePath, discoverHarnessPromptSources, valueChildren, selectKey, allValues, renderings, CALL_SINKS, registerCallSink, registerClassSink, isModelId, collectModels, modelArtifacts, modelUnknowns, collectModelLiterals, agentForScope, createAgentScopeResolver, enumerateAgents, toolNamesOf, EXTRACT_SCHEMA_VERSION, enumerateWorkflows, enumerateToolCatalog, ENUMERATORS, enumerateHarnessComponents, mergeEnumeratedComponents, clearExtractCache, extractHarness, extractHarnessWithContext, scopeOf, serializeExtractResult, runEnumerators, assignAgentIds, runHarnessCommand, writeHarnessAnalyzeResult, emitWrittenArtifacts, analyzeHarnessPrompts, isToolGroupPlaceholder, deterministicOnlyArtifactTypes, repairExternalAnalystReport, deriveRelationshipsFromGraph, deterministicFloorGraph, deterministicArtifacts, deterministicGraphItems, mergeDeterministicArtifacts, analystRefutations, describeCodingAgentEvent, analystEventProgress, isRetryableExternalAnalystFailure, sleep, summarizeInvalidAnalystReport, isDeterministicLocalAnalyst, resolveHarnessAnalyzeConcern, resolveExternalHarnessAnalystInvocation, detectAvailableCodingAgents, codingAgentDisplayName, runCodingAgent, readOnlyClaudeExtraArgs, resolveAnalystModel, renderExternalHarnessAnalystPrompt, CONCERN_CANDIDATE_KINDS, SEED_CANDIDATE_KIND_LABELS, renderAnalystCandidateLines, renderAnalystSeedLines, truncateText, scanHarness, summarizeHarness, buildSourceSnapshot, writeHumanProgress, describeSyncIdentity, describeSyncTenantLabel, findFresherHarnessReports, writeHarnessArtifacts, assertHarnessGraphSyncQuality, graphForSync, inventoryFiles, numericEnv, numericEnvAllowZero, computeDeterministicFloor, stableId, titleFromId, promptNameFromPath };
@@ -4,7 +4,7 @@ import {
4
4
  } from "./cli-rrggdmf8.js";
5
5
  import {
6
6
  inspectPromptManifest
7
- } from "./cli-m82f9yqj.js";
7
+ } from "./cli-w3273wfb.js";
8
8
  import {
9
9
  readHarnessSyncState,
10
10
  renderDoctorHuman,
@@ -395,7 +395,7 @@ async function harnessCurrentCheck(cwd, manifestPath, manifestExists, tenantId)
395
395
  };
396
396
  }
397
397
  try {
398
- const { scanHarness } = await import("./harness-dbkbs04z.js");
398
+ const { scanHarness } = await import("./harness-fp6whmxb.js");
399
399
  const current = scanHarness({
400
400
  rootDir: cwd,
401
401
  scannerVersion: "doctor",
@@ -5768,7 +5768,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5768
5768
  const analyzedDefinitions = new Map;
5769
5769
  if (flags["no-analyze"] !== "true") {
5770
5770
  options.onProgress?.("Analyzing prompt sources before sync.");
5771
- const { analyzeHarnessPrompts } = await import("./harness-dbkbs04z.js");
5771
+ const { analyzeHarnessPrompts } = await import("./harness-fp6whmxb.js");
5772
5772
  const result = await analyzeHarnessPrompts({
5773
5773
  rootDir: process.cwd(),
5774
5774
  existing: established.flatMap((prompt) => prompt.sourceDefinition ? [prompt.sourceDefinition.source] : []),
@@ -5796,7 +5796,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5796
5796
  const mergedSources = mergePromptSources(manifest.sources, extraSources);
5797
5797
  const manifestUpdate = stableJson(mergedSources) === stableJson(mergePromptSources(manifest.sources, [])) ? undefined : $stringify({ version: 2, prompt_paths: manifest.promptPaths, sources: mergedSources });
5798
5798
  const prompts = await discoverPrompts(extraSources);
5799
- const { checkPromptAttribution } = await import("./prompt-attribution-mxmgv3bt.js");
5799
+ const { checkPromptAttribution } = await import("./prompt-attribution-v7qqfz4c.js");
5800
5800
  const attribution = checkPromptAttribution(process.cwd(), prompts.map((prompt) => prompt.key));
5801
5801
  const brokenAttribution = attribution.references.filter((reference) => reference.status === "missing");
5802
5802
  if (brokenAttribution.length) {
@@ -6102,7 +6102,7 @@ async function migratePromptManifest(options = {}) {
6102
6102
  let addedSources = [];
6103
6103
  let pendingSources = [];
6104
6104
  if (options.discover) {
6105
- const { analyzeHarnessPrompts } = await import("./harness-dbkbs04z.js");
6105
+ const { analyzeHarnessPrompts } = await import("./harness-fp6whmxb.js");
6106
6106
  const result = await analyzeHarnessPrompts({
6107
6107
  rootDir: root,
6108
6108
  existing: manifest.sources,
package/dist/cli.js CHANGED
@@ -2975,25 +2975,25 @@ function leafManifestFields(leaf, commands) {
2975
2975
  import { fileURLToPath } from "url";
2976
2976
  import { realpathSync } from "fs";
2977
2977
  async function runPromptsCommand(...args) {
2978
- return (await import("./prompts-tc7fntm5.js")).runPromptsCommand(...args);
2978
+ return (await import("./prompts-1spfbzym.js")).runPromptsCommand(...args);
2979
2979
  }
2980
2980
  async function runSkillsCommand(...args) {
2981
2981
  return (await import("./skills-knpeqryb.js")).runSkillsCommand(...args);
2982
2982
  }
2983
2983
  async function runHarnessCommand(...args) {
2984
- return (await import("./harness-dbkbs04z.js")).runHarnessCommand(...args);
2984
+ return (await import("./harness-fp6whmxb.js")).runHarnessCommand(...args);
2985
2985
  }
2986
2986
  async function runSyncCommand(...args) {
2987
- return (await import("./sync-chceab5e.js")).runSyncCommand(...args);
2987
+ return (await import("./sync-zmj30a60.js")).runSyncCommand(...args);
2988
2988
  }
2989
2989
  async function runRegistryCommand(...args) {
2990
2990
  return (await import("./registry-c64qr7ta.js")).runRegistryCommand(...args);
2991
2991
  }
2992
2992
  async function runDoctorCommand(...args) {
2993
- return (await import("./doctor-txsjyfes.js")).runDoctorCommand(...args);
2993
+ return (await import("./doctor-wcnsa4vf.js")).runDoctorCommand(...args);
2994
2994
  }
2995
2995
  async function runStatusCommand(...args) {
2996
- return (await import("./doctor-txsjyfes.js")).runStatusCommand(...args);
2996
+ return (await import("./doctor-wcnsa4vf.js")).runStatusCommand(...args);
2997
2997
  }
2998
2998
  async function runAuthCommand(...args) {
2999
2999
  return (await import("./profile-commands-1fdvrs5y.js")).runAuthCommand(...args);
@@ -3005,7 +3005,7 @@ async function runProfilesCommand(...args) {
3005
3005
  return (await import("./profile-commands-1fdvrs5y.js")).runProfilesCommand(...args);
3006
3006
  }
3007
3007
  async function runAgentCommand(...args) {
3008
- return (await import("./agent-3acxyetj.js")).runAgentCommand(...args);
3008
+ return (await import("./agent-qpkd30kf.js")).runAgentCommand(...args);
3009
3009
  }
3010
3010
  async function runProductionCommand(...args) {
3011
3011
  return (await import("./production-intelligence-f9sd68te.js")).runProductionCommand(...args);
@@ -6769,7 +6769,7 @@ var commandRegistry = createCommandRegistry([
6769
6769
  resetApiRequestCountBeforeRun: true,
6770
6770
  telemetry: "result-and-error",
6771
6771
  handler: async (context) => {
6772
- const { runInit } = await import("./index-xb4svyw4.js");
6772
+ const { runInit } = await import("./index-xhayray3.js");
6773
6773
  if (context.outputMode === "agent-stream") {
6774
6774
  context.output.writeEvent({
6775
6775
  event: "started",
@@ -3,9 +3,9 @@ import {
3
3
  promptsDiscoveredCheck,
4
4
  runDoctorCommand,
5
5
  runStatusCommand
6
- } from "./cli-w5en52xc.js";
6
+ } from "./cli-mmskch5x.js";
7
7
  import"./cli-rrggdmf8.js";
8
- import"./cli-m82f9yqj.js";
8
+ import"./cli-w3273wfb.js";
9
9
  import"./cli-mm48br00.js";
10
10
  import"./cli-k0vxtzxb.js";
11
11
  import"./cli-22yvg5kh.js";
@@ -14,6 +14,7 @@ import {
14
14
  describeSyncTenantLabel,
15
15
  detectAvailableCodingAgents,
16
16
  deterministicArtifacts,
17
+ deterministicFloorGraph,
17
18
  deterministicGraphItems,
18
19
  deterministicOnlyArtifactTypes,
19
20
  emitWrittenArtifacts,
@@ -47,7 +48,7 @@ import {
47
48
  writeHarnessAnalyzeResult,
48
49
  writeHarnessArtifacts,
49
50
  writeHumanProgress
50
- } from "./cli-qa0rbdjd.js";
51
+ } from "./cli-1g4s7kv5.js";
51
52
  import"./cli-k0vxtzxb.js";
52
53
  import"./cli-97fnztpy.js";
53
54
  import {
@@ -97,6 +98,7 @@ export {
97
98
  emitWrittenArtifacts,
98
99
  deterministicOnlyArtifactTypes,
99
100
  deterministicGraphItems,
101
+ deterministicFloorGraph,
100
102
  deterministicArtifacts,
101
103
  detectAvailableCodingAgents,
102
104
  describeSyncTenantLabel,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildSourceSnapshot
3
- } from "./cli-qa0rbdjd.js";
3
+ } from "./cli-1g4s7kv5.js";
4
4
  import"./cli-k0vxtzxb.js";
5
5
  import"./cli-97fnztpy.js";
6
6
  import"./cli-y333w08f.js";
@@ -7,7 +7,7 @@ import {
7
7
  enumerateToolCatalog,
8
8
  enumerateWorkflows,
9
9
  mergeEnumeratedComponents
10
- } from "./cli-qa0rbdjd.js";
10
+ } from "./cli-1g4s7kv5.js";
11
11
  import"./cli-k0vxtzxb.js";
12
12
  import"./cli-97fnztpy.js";
13
13
  import"./cli-y333w08f.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-w5en52xc.js";
3
+ } from "./cli-mmskch5x.js";
4
4
  import {
5
5
  selectTenantAndCreateKey
6
6
  } from "./cli-n1406hqg.js";
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  initPrompts,
22
22
  runPromptSync
23
- } from "./cli-m82f9yqj.js";
23
+ } from "./cli-w3273wfb.js";
24
24
  import {
25
25
  agentsMdProblem,
26
26
  runSkillSync
@@ -46,7 +46,7 @@ import {
46
46
  runCodingAgent,
47
47
  runHarnessCommand,
48
48
  startRemoteAnalyze
49
- } from "./cli-qa0rbdjd.js";
49
+ } from "./cli-1g4s7kv5.js";
50
50
  import {
51
51
  canonicalText,
52
52
  renderInitBanner,
@@ -21,7 +21,7 @@ import {
21
21
  serializeExtractResult,
22
22
  toolNamesOf,
23
23
  valueChildren
24
- } from "./cli-qa0rbdjd.js";
24
+ } from "./cli-1g4s7kv5.js";
25
25
  import"./cli-k0vxtzxb.js";
26
26
  import"./cli-97fnztpy.js";
27
27
  import"./cli-y333w08f.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  inventoryFiles,
3
3
  safePromptEvidencePath
4
- } from "./cli-qa0rbdjd.js";
4
+ } from "./cli-1g4s7kv5.js";
5
5
  import"./cli-k0vxtzxb.js";
6
6
  import"./cli-97fnztpy.js";
7
7
  import"./cli-y333w08f.js";
@@ -3,7 +3,7 @@ import {
3
3
  checkPromptMapping,
4
4
  discoverHarnessPromptSources,
5
5
  safePromptEvidencePath
6
- } from "./cli-qa0rbdjd.js";
6
+ } from "./cli-1g4s7kv5.js";
7
7
  import"./cli-k0vxtzxb.js";
8
8
  import"./cli-97fnztpy.js";
9
9
  import"./cli-y333w08f.js";
@@ -9,7 +9,7 @@ import {
9
9
  runPromptSync,
10
10
  runPromptsCommand,
11
11
  writePromptSyncProgress
12
- } from "./cli-m82f9yqj.js";
12
+ } from "./cli-w3273wfb.js";
13
13
  import {
14
14
  promptSourceHashPayload
15
15
  } from "./cli-mm48br00.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPromptsCommand
3
- } from "./cli-m82f9yqj.js";
3
+ } from "./cli-w3273wfb.js";
4
4
  import {
5
5
  runSkillsCommand
6
6
  } from "./cli-1smcq5pf.js";
@@ -10,7 +10,7 @@ import"./cli-hcwdz9sd.js";
10
10
  import"./cli-mm48br00.js";
11
11
  import {
12
12
  runHarnessCommand
13
- } from "./cli-qa0rbdjd.js";
13
+ } from "./cli-1g4s7kv5.js";
14
14
  import"./cli-k0vxtzxb.js";
15
15
  import"./cli-97fnztpy.js";
16
16
  import"./cli-y333w08f.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moda-ai/cli",
3
- "version": "1.55.79",
3
+ "version": "1.55.81",
4
4
  "description": "CLI for Moda: production monitoring and evals for AI agents.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "moda.skill_index.v1",
3
- "bundled_at": "2026-10-21T10:41:36.841Z",
4
- "cli_version": "1.55.79",
3
+ "bundled_at": "2026-10-21T11:20:00.724Z",
4
+ "cli_version": "1.55.81",
5
5
  "skills": [
6
6
  {
7
7
  "id": "integration-cloudflare-think",