@jeger-ai/opengantry 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/commands/arch.js +3 -3
  3. package/dist/cli/commands/arch.js.map +1 -1
  4. package/dist/cli/commands/audit-rigor.js +2 -2
  5. package/dist/cli/commands/audit-rigor.js.map +1 -1
  6. package/dist/cli/commands/contract.d.ts +7 -0
  7. package/dist/cli/commands/contract.d.ts.map +1 -1
  8. package/dist/cli/commands/contract.js +22 -1
  9. package/dist/cli/commands/contract.js.map +1 -1
  10. package/dist/cli/commands/interrogate.js +2 -2
  11. package/dist/cli/commands/interrogate.js.map +1 -1
  12. package/dist/cli/commands/status.js +2 -2
  13. package/dist/cli/commands/status.js.map +1 -1
  14. package/dist/cli/commands/verify.d.ts.map +1 -1
  15. package/dist/cli/commands/verify.js +44 -24
  16. package/dist/cli/commands/verify.js.map +1 -1
  17. package/dist/cli/lib/cli-io.d.ts +2 -0
  18. package/dist/cli/lib/cli-io.d.ts.map +1 -1
  19. package/dist/cli/lib/cli-io.js +9 -1
  20. package/dist/cli/lib/cli-io.js.map +1 -1
  21. package/dist/cli/lib/command-boundary.js +2 -2
  22. package/dist/cli/lib/command-boundary.js.map +1 -1
  23. package/dist/cli/lib/command-reporter.d.ts +0 -2
  24. package/dist/cli/lib/command-reporter.d.ts.map +1 -1
  25. package/dist/cli/lib/command-reporter.js +0 -5
  26. package/dist/cli/lib/command-reporter.js.map +1 -1
  27. package/dist/cli/lib/contract/intent-path-tokens.d.ts +7 -0
  28. package/dist/cli/lib/contract/intent-path-tokens.d.ts.map +1 -0
  29. package/dist/cli/lib/contract/intent-path-tokens.js +30 -0
  30. package/dist/cli/lib/contract/intent-path-tokens.js.map +1 -0
  31. package/dist/cli/lib/contract/preflight-heuristic.d.ts +11 -0
  32. package/dist/cli/lib/contract/preflight-heuristic.d.ts.map +1 -0
  33. package/dist/cli/lib/contract/preflight-heuristic.js +38 -0
  34. package/dist/cli/lib/contract/preflight-heuristic.js.map +1 -0
  35. package/dist/cli/lib/contract/preflight-jev.d.ts +54 -0
  36. package/dist/cli/lib/contract/preflight-jev.d.ts.map +1 -0
  37. package/dist/cli/lib/contract/preflight-jev.js +247 -0
  38. package/dist/cli/lib/contract/preflight-jev.js.map +1 -0
  39. package/dist/cli/lib/contract/preflight-types.d.ts +19 -0
  40. package/dist/cli/lib/contract/preflight-types.d.ts.map +1 -0
  41. package/dist/cli/lib/contract/preflight-types.js +9 -0
  42. package/dist/cli/lib/contract/preflight-types.js.map +1 -0
  43. package/dist/cli/lib/contract/preflight.d.ts +16 -0
  44. package/dist/cli/lib/contract/preflight.d.ts.map +1 -0
  45. package/dist/cli/lib/contract/preflight.js +34 -0
  46. package/dist/cli/lib/contract/preflight.js.map +1 -0
  47. package/dist/cli/lib/contract/propose.d.ts.map +1 -1
  48. package/dist/cli/lib/contract/propose.js +2 -23
  49. package/dist/cli/lib/contract/propose.js.map +1 -1
  50. package/dist/cli/lib/mcp-preflight-contract.d.ts +19 -0
  51. package/dist/cli/lib/mcp-preflight-contract.d.ts.map +1 -0
  52. package/dist/cli/lib/mcp-preflight-contract.js +31 -0
  53. package/dist/cli/lib/mcp-preflight-contract.js.map +1 -0
  54. package/dist/cli/lib/mcp-tools-register.d.ts.map +1 -1
  55. package/dist/cli/lib/mcp-tools-register.js +9 -0
  56. package/dist/cli/lib/mcp-tools-register.js.map +1 -1
  57. package/dist/cli/lib/output-context.d.ts +7 -2
  58. package/dist/cli/lib/output-context.d.ts.map +1 -1
  59. package/dist/cli/lib/output-context.js +17 -9
  60. package/dist/cli/lib/output-context.js.map +1 -1
  61. package/dist/cli/lib/sarif-uri.d.ts +3 -0
  62. package/dist/cli/lib/sarif-uri.d.ts.map +1 -0
  63. package/dist/cli/lib/sarif-uri.js +15 -0
  64. package/dist/cli/lib/sarif-uri.js.map +1 -0
  65. package/dist/cli/lib/verify-export.d.ts +19 -3
  66. package/dist/cli/lib/verify-export.d.ts.map +1 -1
  67. package/dist/cli/lib/verify-export.js +47 -24
  68. package/dist/cli/lib/verify-export.js.map +1 -1
  69. package/dist/cli/lib/verify-presenters.d.ts +6 -2
  70. package/dist/cli/lib/verify-presenters.d.ts.map +1 -1
  71. package/dist/cli/lib/verify-presenters.js +34 -12
  72. package/dist/cli/lib/verify-presenters.js.map +1 -1
  73. package/dist/cli/lib/version.gen.d.ts +1 -1
  74. package/dist/cli/lib/version.gen.js +1 -1
  75. package/dist/cli/program-audience-hook.d.ts +4 -0
  76. package/dist/cli/program-audience-hook.d.ts.map +1 -0
  77. package/dist/cli/program-audience-hook.js +85 -0
  78. package/dist/cli/program-audience-hook.js.map +1 -0
  79. package/dist/cli/program-mission.d.ts.map +1 -1
  80. package/dist/cli/program-mission.js +16 -1
  81. package/dist/cli/program-mission.js.map +1 -1
  82. package/dist/cli/program-workflow.d.ts.map +1 -1
  83. package/dist/cli/program-workflow.js +4 -2
  84. package/dist/cli/program-workflow.js.map +1 -1
  85. package/dist/cli/program.js +1 -1
  86. package/dist/cli/program.js.map +1 -1
  87. package/package.json +1 -1
  88. package/templates/.cursor/mcp.json +1 -2
  89. package/templates/.cursor/rules/opengantry-gxt-substrate.mdc +1 -1
  90. package/templates/.gitagent/foreman/SUBSTRATE.version.json +1 -1
  91. package/templates/.gitagent/planner/MISSION-ARCHITECT.md +4 -2
  92. package/templates/integrations/asset-catalog.json +1 -0
  93. package/templates/integrations/compatibility.json +1 -1
  94. package/templates/integrations/recipes/cursor.md +1 -1
  95. package/templates/scripts/mcp-launcher.sh +11 -0
  96. package/templates/scripts/validate-mcp-dogfood.mjs +7 -2
  97. package/dist/cli/lib/program-audience-hook.d.ts +0 -4
  98. package/dist/cli/lib/program-audience-hook.d.ts.map +0 -1
  99. package/dist/cli/lib/program-audience-hook.js +0 -35
  100. package/dist/cli/lib/program-audience-hook.js.map +0 -1
@@ -0,0 +1,38 @@
1
+ import { normalizeContractPath } from "./contract-hash.js";
2
+ import { existingHintedPaths } from "./intent-path-tokens.js";
3
+ import { PREFLIGHT_MIN_CONFIDENCE } from "./preflight-types.js";
4
+ import { isTriageEscalated, triageIntent } from "../triage-logic.js";
5
+ function skillRootsFor(manifest, skillKey) {
6
+ if (!skillKey)
7
+ return [];
8
+ return (manifest.skills[skillKey]?.tmvc_roots ?? []).map(normalizeContractPath);
9
+ }
10
+ function candidateScores(paths) {
11
+ return paths.map((path) => ({ path, score: 1 }));
12
+ }
13
+ function emitSkillKey(skillKey, confidence, escalate) {
14
+ if (escalate || skillKey === null || skillKey === "NONE")
15
+ return null;
16
+ if (confidence < PREFLIGHT_MIN_CONFIDENCE)
17
+ return null;
18
+ return skillKey;
19
+ }
20
+ /** Offline skill/path classifier. Never calls a network. */
21
+ export function runHeuristicPreflight(input) {
22
+ const triage = triageIntent(input.root, input.intent, input.manifest);
23
+ const escalate = isTriageEscalated(triage);
24
+ const resolved = escalate ? null : triage.skill_key === "NONE" ? null : triage.skill_key;
25
+ const roots = skillRootsFor(input.manifest, resolved);
26
+ const hinted = existingHintedPaths(input.root, input.intent, input.paths, roots);
27
+ const tmvc_root_candidates = hinted.length > 0 ? candidateScores(hinted) : candidateScores([...roots].sort());
28
+ const rationale = [...triage.match_reasons, triage.reason];
29
+ return {
30
+ provider: "heuristic",
31
+ skill_key: emitSkillKey(resolved, triage.confidence, escalate),
32
+ skill_confidence: triage.confidence,
33
+ tmvc_root_candidates,
34
+ escalate,
35
+ rationale,
36
+ };
37
+ }
38
+ //# sourceMappingURL=preflight-heuristic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-heuristic.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight-heuristic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAgD,MAAM,sBAAsB,CAAC;AAC9G,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUrE,SAAS,aAAa,CAAC,QAAkB,EAAE,QAAuB;IAChE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,eAAe,CAAC,KAAwB;IAC/C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,QAAuB,EAAE,UAAkB,EAAE,QAAiB;IAClF,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,UAAU,GAAG,wBAAwB;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,qBAAqB,CAAC,KAA8B;IAClE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACzF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjF,MAAM,oBAAoB,GACxB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC;QAC9D,gBAAgB,EAAE,MAAM,CAAC,UAAU;QACnC,oBAAoB;QACpB,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { type JevFallbackReason, type PreflightResult, type TmvcRootCandidate } from "./preflight-types.js";
2
+ import type { Manifest } from "../types.js";
3
+ export declare const JEV_SYSTEM_ONE_URL = "https://api.typesafe.ai/v1/systemone";
4
+ export declare const JEV_MODEL = "jev-latest";
5
+ export declare const TYPESAFE_API_KEY_ENV = "TYPESAFE_API_KEY";
6
+ export declare const JEV_FETCH_TIMEOUT_MS = 2000;
7
+ export interface JevPreflightInput {
8
+ root: string;
9
+ manifest: Manifest;
10
+ intent: string;
11
+ paths?: string[];
12
+ apiKey: string;
13
+ fetchImpl?: typeof fetch;
14
+ /** Override fetch timeout (ms). Production default is `JEV_FETCH_TIMEOUT_MS`. */
15
+ timeoutMs?: number;
16
+ }
17
+ export interface JevQuestionSpec {
18
+ type: "choice" | "noul";
19
+ instructions: string;
20
+ criteria?: Record<string, string>;
21
+ }
22
+ export interface JevSystemOneRequest {
23
+ model: string;
24
+ state: {
25
+ intent: string;
26
+ paths: string[];
27
+ skills: Record<string, {
28
+ desc: string;
29
+ tmvc_roots: string[];
30
+ }>;
31
+ };
32
+ questions: Record<string, JevQuestionSpec>;
33
+ }
34
+ type JevParsed = {
35
+ skillKey: string;
36
+ skillConfidence: number;
37
+ escalate: boolean;
38
+ candidates: TmvcRootCandidate[];
39
+ };
40
+ export declare function buildJevRequest(input: {
41
+ intent: string;
42
+ paths?: string[];
43
+ manifest: Manifest;
44
+ }): JevSystemOneRequest;
45
+ export declare function parseJevAnswers(body: unknown, manifest: Manifest): {
46
+ ok: true;
47
+ value: JevParsed;
48
+ } | {
49
+ ok: false;
50
+ reason: JevFallbackReason;
51
+ };
52
+ export declare function runJevPreflight(input: JevPreflightInput): Promise<PreflightResult>;
53
+ export {};
54
+ //# sourceMappingURL=preflight-jev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-jev.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight-jev.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,kBAAkB,yCAAyC,CAAC;AACzE,eAAO,MAAM,SAAS,eAAe,CAAC;AACtC,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AACvD,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAMzC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAC3G,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC5C;AAED,KAAK,SAAS,GAAG;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC,CAAC;AAkBF,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB,GAAG,mBAAmB,CA4BtB;AA0ED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,GACjB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CA0B3E;AA0DD,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCxF"}
@@ -0,0 +1,247 @@
1
+ import { normalizeContractPath } from "./contract-hash.js";
2
+ import { runHeuristicPreflight } from "./preflight-heuristic.js";
3
+ import { PREFLIGHT_MIN_CONFIDENCE, jevFallbackRationale, } from "./preflight-types.js";
4
+ import { logWarn } from "../cli-io.js";
5
+ import { GantryUserError } from "../errors.js";
6
+ export const JEV_SYSTEM_ONE_URL = "https://api.typesafe.ai/v1/systemone";
7
+ export const JEV_MODEL = "jev-latest";
8
+ export const TYPESAFE_API_KEY_ENV = "TYPESAFE_API_KEY";
9
+ export const JEV_FETCH_TIMEOUT_MS = 2000;
10
+ const SKILL_Q = "skill";
11
+ const ESCALATE_Q = "escalate";
12
+ const ROOT_PREFIX = "root:";
13
+ function skillCatalog(manifest) {
14
+ const out = {};
15
+ for (const [key, skill] of Object.entries(manifest.skills)) {
16
+ out[key] = { desc: skill.desc ?? key, tmvc_roots: skill.tmvc_roots.map(normalizeContractPath) };
17
+ }
18
+ return out;
19
+ }
20
+ function allSkillRoots(manifest) {
21
+ const roots = new Set();
22
+ for (const skill of Object.values(manifest.skills)) {
23
+ for (const r of skill.tmvc_roots)
24
+ roots.add(normalizeContractPath(r));
25
+ }
26
+ return [...roots].sort();
27
+ }
28
+ export function buildJevRequest(input) {
29
+ const catalog = skillCatalog(input.manifest);
30
+ const criteria = {};
31
+ for (const [key, meta] of Object.entries(catalog)) {
32
+ criteria[key] = meta.desc;
33
+ }
34
+ const questions = {
35
+ [SKILL_Q]: {
36
+ type: "choice",
37
+ instructions: "Which manifest skill_key owns this intent?",
38
+ criteria,
39
+ },
40
+ [ESCALATE_Q]: {
41
+ type: "noul",
42
+ instructions: "Does this intent hit path_risks or risk_keywords that require Planner escalation?",
43
+ },
44
+ };
45
+ for (const root of allSkillRoots(input.manifest)) {
46
+ questions[`${ROOT_PREFIX}${root}`] = {
47
+ type: "noul",
48
+ instructions: `Is ${root} a relevant TMVC root for this intent?`,
49
+ };
50
+ }
51
+ return {
52
+ model: JEV_MODEL,
53
+ state: { intent: input.intent, paths: [...(input.paths ?? [])], skills: catalog },
54
+ questions,
55
+ };
56
+ }
57
+ function fallback(input, reason) {
58
+ logWarn(`jev_preflight fallback reason=${reason}`);
59
+ const heuristic = runHeuristicPreflight({
60
+ root: input.root,
61
+ manifest: input.manifest,
62
+ intent: input.intent,
63
+ paths: input.paths,
64
+ });
65
+ return { ...heuristic, rationale: [jevFallbackRationale(reason), ...heuristic.rationale] };
66
+ }
67
+ function isUnit(n) {
68
+ return typeof n === "number" && Number.isFinite(n) && n >= 0 && n <= 1;
69
+ }
70
+ function asAnswers(body) {
71
+ if (!body || typeof body !== "object" || !("answers" in body))
72
+ return { ok: false, reason: "malformed_response" };
73
+ const answers = body.answers;
74
+ if (!answers || typeof answers !== "object" || Array.isArray(answers)) {
75
+ return { ok: false, reason: "malformed_response" };
76
+ }
77
+ const out = {};
78
+ for (const [key, value] of Object.entries(answers)) {
79
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
80
+ return { ok: false, reason: classifyProbabilities(value) };
81
+ }
82
+ const rec = value;
83
+ if (!isUnit(rec.noul) && rec.noul !== undefined)
84
+ return { ok: false, reason: "invalid_probability" };
85
+ if (!isUnit(rec.confidence) && rec.confidence !== undefined)
86
+ return { ok: false, reason: "invalid_probability" };
87
+ out[key] = rec;
88
+ }
89
+ return { ok: true, answers: out };
90
+ }
91
+ function classifyProbabilities(value) {
92
+ if (value && typeof value === "object") {
93
+ const rec = value;
94
+ for (const field of ["noul", "confidence"]) {
95
+ const n = rec[field];
96
+ if (typeof n === "number" && !isUnit(n))
97
+ return "invalid_probability";
98
+ }
99
+ }
100
+ return "malformed_response";
101
+ }
102
+ function parseRootCandidates(answers, skillRoots, knownRoots) {
103
+ const skillRootSet = new Set(skillRoots);
104
+ const knownRootSet = new Set(knownRoots);
105
+ const candidates = [];
106
+ for (const [key, answer] of Object.entries(answers)) {
107
+ if (!key.startsWith(ROOT_PREFIX))
108
+ continue;
109
+ const rootPath = normalizeContractPath(key.slice(ROOT_PREFIX.length));
110
+ if (!knownRootSet.has(rootPath))
111
+ return { ok: false, reason: "unexpected_choice" };
112
+ if (!skillRootSet.has(rootPath))
113
+ continue;
114
+ if (answer.type !== "noul" || !isUnit(answer.noul))
115
+ return { ok: false, reason: "malformed_response" };
116
+ candidates.push({ path: rootPath, score: answer.noul });
117
+ }
118
+ return { ok: true, candidates: candidates.sort((a, b) => a.path.localeCompare(b.path)) };
119
+ }
120
+ function classifyParseFail(body) {
121
+ const parsed = asAnswers(body);
122
+ if (parsed.ok)
123
+ return "malformed_response";
124
+ return parsed.reason;
125
+ }
126
+ export function parseJevAnswers(body, manifest) {
127
+ const parsed = asAnswers(body);
128
+ if (!parsed.ok)
129
+ return parsed;
130
+ const skillAnswer = parsed.answers[SKILL_Q];
131
+ if (!skillAnswer || skillAnswer.type !== "choice" || typeof skillAnswer.choice !== "string" || !isUnit(skillAnswer.confidence)) {
132
+ return { ok: false, reason: classifyParseFail(body) };
133
+ }
134
+ const skillKeys = Object.keys(manifest.skills);
135
+ if (!skillKeys.includes(skillAnswer.choice))
136
+ return { ok: false, reason: "unexpected_choice" };
137
+ const escalateAnswer = parsed.answers[ESCALATE_Q];
138
+ const escalate = escalateAnswer?.type === "noul" && isUnit(escalateAnswer.noul)
139
+ ? escalateAnswer.noul >= PREFLIGHT_MIN_CONFIDENCE
140
+ : false;
141
+ const skillRoots = (manifest.skills[skillAnswer.choice]?.tmvc_roots ?? []).map(normalizeContractPath);
142
+ const roots = parseRootCandidates(parsed.answers, skillRoots, allSkillRoots(manifest));
143
+ if (!roots.ok)
144
+ return roots;
145
+ return {
146
+ ok: true,
147
+ value: {
148
+ skillKey: skillAnswer.choice,
149
+ skillConfidence: skillAnswer.confidence,
150
+ escalate,
151
+ candidates: roots.candidates,
152
+ },
153
+ };
154
+ }
155
+ function emitFromParsed(parsed) {
156
+ const low = parsed.skillConfidence < PREFLIGHT_MIN_CONFIDENCE;
157
+ return {
158
+ provider: "jev",
159
+ skill_key: parsed.escalate || low ? null : parsed.skillKey,
160
+ skill_confidence: parsed.skillConfidence,
161
+ tmvc_root_candidates: parsed.candidates,
162
+ escalate: parsed.escalate || low,
163
+ rationale: ["jev: systemone choice+noul pass"],
164
+ };
165
+ }
166
+ function isMappedPreflightValid(result) {
167
+ if (result.skill_key !== null && typeof result.skill_key !== "string")
168
+ return false;
169
+ if (!isUnit(result.skill_confidence))
170
+ return false;
171
+ if (!Array.isArray(result.tmvc_root_candidates))
172
+ return false;
173
+ for (const candidate of result.tmvc_root_candidates) {
174
+ if (!candidate || typeof candidate !== "object")
175
+ return false;
176
+ if (typeof candidate.path !== "string" || !isUnit(candidate.score))
177
+ return false;
178
+ }
179
+ return true;
180
+ }
181
+ function isTimeoutFailure(error) {
182
+ return error instanceof Error && error.name === "AbortError";
183
+ }
184
+ function resolveFetchTimeoutMs(timeoutMs) {
185
+ if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0)
186
+ return timeoutMs;
187
+ return JEV_FETCH_TIMEOUT_MS;
188
+ }
189
+ async function fetchWithTimeout(fetchImpl, init, timeoutMs) {
190
+ const controller = new AbortController();
191
+ let timer;
192
+ const timedOut = new Promise((_, reject) => {
193
+ timer = setTimeout(() => {
194
+ controller.abort();
195
+ const err = new Error("jev_timeout");
196
+ err.name = "AbortError";
197
+ reject(err);
198
+ }, timeoutMs);
199
+ });
200
+ try {
201
+ const request = fetchImpl(JEV_SYSTEM_ONE_URL, { ...init, signal: controller.signal });
202
+ void request.catch(() => undefined);
203
+ return await Promise.race([request, timedOut]);
204
+ }
205
+ finally {
206
+ if (timer !== undefined)
207
+ clearTimeout(timer);
208
+ }
209
+ }
210
+ export async function runJevPreflight(input) {
211
+ if (!input.apiKey.trim()) {
212
+ throw new GantryUserError("INVALID_ARGUMENT", "contract preflight --provider jev requires TYPESAFE_API_KEY", "export TYPESAFE_API_KEY or use --provider heuristic", 2);
213
+ }
214
+ const fetchImpl = input.fetchImpl ?? globalThis.fetch;
215
+ const payload = buildJevRequest(input);
216
+ let response;
217
+ try {
218
+ response = await fetchWithTimeout(fetchImpl, {
219
+ method: "POST",
220
+ headers: {
221
+ Authorization: `Bearer ${input.apiKey}`,
222
+ "Content-Type": "application/json",
223
+ },
224
+ body: JSON.stringify(payload),
225
+ }, resolveFetchTimeoutMs(input.timeoutMs));
226
+ }
227
+ catch (error) {
228
+ return fallback(input, isTimeoutFailure(error) ? "timeout" : "transport_error");
229
+ }
230
+ if (!response.ok)
231
+ return fallback(input, "transport_error");
232
+ let body;
233
+ try {
234
+ body = await response.json();
235
+ }
236
+ catch {
237
+ return fallback(input, "malformed_response");
238
+ }
239
+ const parsed = parseJevAnswers(body, input.manifest);
240
+ if (!parsed.ok)
241
+ return fallback(input, parsed.reason);
242
+ const emitted = emitFromParsed(parsed.value);
243
+ if (!isMappedPreflightValid(emitted))
244
+ return fallback(input, "malformed_response");
245
+ return emitted;
246
+ }
247
+ //# sourceMappingURL=preflight-jev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-jev.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight-jev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const PREFLIGHT_PROVIDERS: readonly ["heuristic", "jev"];
2
+ export type PreflightProvider = (typeof PREFLIGHT_PROVIDERS)[number];
3
+ export declare const PREFLIGHT_MIN_CONFIDENCE = 0.5;
4
+ export type JevFallbackReason = "malformed_response" | "unexpected_choice" | "transport_error" | "timeout" | "invalid_probability";
5
+ export interface TmvcRootCandidate {
6
+ path: string;
7
+ score: number;
8
+ }
9
+ export interface PreflightResult {
10
+ provider: PreflightProvider;
11
+ skill_key: string | null;
12
+ skill_confidence: number;
13
+ tmvc_root_candidates: TmvcRootCandidate[];
14
+ escalate: boolean;
15
+ rationale: string[];
16
+ }
17
+ export declare function isPreflightProvider(value: string): value is PreflightProvider;
18
+ export declare function jevFallbackRationale(reason: JevFallbackReason): string;
19
+ //# sourceMappingURL=preflight-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-types.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,+BAAgC,CAAC;AACjE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,mBAAmB,GACnB,iBAAiB,GACjB,SAAS,GACT,qBAAqB,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAE7E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAEtE"}
@@ -0,0 +1,9 @@
1
+ export const PREFLIGHT_PROVIDERS = ["heuristic", "jev"];
2
+ export const PREFLIGHT_MIN_CONFIDENCE = 0.5;
3
+ export function isPreflightProvider(value) {
4
+ return PREFLIGHT_PROVIDERS.includes(value);
5
+ }
6
+ export function jevFallbackRationale(reason) {
7
+ return `jev_fallback: ${reason}`;
8
+ }
9
+ //# sourceMappingURL=preflight-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-types.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,KAAK,CAAU,CAAC;AAGjE,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAuB5C,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,OAAO,iBAAiB,MAAM,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type PreflightProvider, type PreflightResult } from "./preflight-types.js";
2
+ import type { Manifest } from "../types.js";
3
+ export type { PreflightProvider, PreflightResult, TmvcRootCandidate } from "./preflight-types.js";
4
+ export { PREFLIGHT_MIN_CONFIDENCE, PREFLIGHT_PROVIDERS, isPreflightProvider } from "./preflight-types.js";
5
+ export interface RunPreflightInput {
6
+ root: string;
7
+ manifest: Manifest;
8
+ intent: string;
9
+ paths?: string[];
10
+ provider?: PreflightProvider;
11
+ apiKey?: string;
12
+ fetchImpl?: typeof fetch;
13
+ }
14
+ /** Advisory classifier in front of proposeContract. Never writes a contract or hash. */
15
+ export declare function runPreflight(input: RunPreflightInput): Promise<PreflightResult>;
16
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEzG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE1G,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAeD,wFAAwF;AACxF,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBrF"}
@@ -0,0 +1,34 @@
1
+ import { runHeuristicPreflight } from "./preflight-heuristic.js";
2
+ import { runJevPreflight } from "./preflight-jev.js";
3
+ import { isPreflightProvider } from "./preflight-types.js";
4
+ import { GantryUserError } from "../errors.js";
5
+ export { PREFLIGHT_MIN_CONFIDENCE, PREFLIGHT_PROVIDERS, isPreflightProvider } from "./preflight-types.js";
6
+ function assertProvider(provider) {
7
+ const resolved = provider ?? "heuristic";
8
+ if (!isPreflightProvider(resolved)) {
9
+ throw new GantryUserError("INVALID_ARGUMENT", `contract preflight: unknown provider ${resolved}`, "Use heuristic or jev", 2);
10
+ }
11
+ return resolved;
12
+ }
13
+ /** Advisory classifier in front of proposeContract. Never writes a contract or hash. */
14
+ export async function runPreflight(input) {
15
+ const provider = assertProvider(input.provider);
16
+ switch (provider) {
17
+ case "heuristic":
18
+ return runHeuristicPreflight(input);
19
+ case "jev":
20
+ return runJevPreflight({
21
+ root: input.root,
22
+ manifest: input.manifest,
23
+ intent: input.intent,
24
+ paths: input.paths,
25
+ apiKey: input.apiKey ?? "",
26
+ fetchImpl: input.fetchImpl,
27
+ });
28
+ default: {
29
+ const _exhaustive = provider;
30
+ throw new GantryUserError("INVALID_ARGUMENT", `contract preflight: unhandled provider ${String(_exhaustive)}`, undefined, 2);
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAgD,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAY1G,SAAS,cAAc,CAAC,QAA4B;IAClD,MAAM,QAAQ,GAAG,QAAQ,IAAI,WAAW,CAAC;IACzC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,eAAe,CACvB,kBAAkB,EAClB,wCAAwC,QAAQ,EAAE,EAClD,sBAAsB,EACtB,CAAC,CACF,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAwB;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,KAAK;YACR,OAAO,eAAe,CAAC;gBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC;QACL,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,0CAA0C,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/H,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,IAAI,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGjF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AA4DD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAmClF"}
1
+ {"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,IAAI,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGjF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAsCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAmClF"}
@@ -1,33 +1,12 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
1
  import { loadPolicyBundleQuiet } from "./effective-scope.js";
4
2
  import { normalizeContract, normalizeContractPath } from "./contract-hash.js";
3
+ import { existingHintedPaths } from "./intent-path-tokens.js";
5
4
  import { proposeGate } from "./propose-gate.js";
6
5
  import { proposeImports } from "./propose-imports.js";
7
6
  import { isPathUnderRoot } from "../tmvc-path.js";
8
7
  import { resolveManifestSkillKey } from "../skill-key.js";
9
- const PATH_TOKEN_RE = /(?:\.{0,2}\/)?[A-Za-z0-9_.@-]+(?:\/[A-Za-z0-9_.@-]+)+\/?/g;
10
- function existsRepoPath(root, rel) {
11
- return fs.existsSync(path.join(root, rel));
12
- }
13
- function intentPathTokens(intent) {
14
- const out = [];
15
- for (const m of intent.matchAll(PATH_TOKEN_RE)) {
16
- const norm = normalizeContractPath(m[0]);
17
- if (norm && !norm.includes("://"))
18
- out.push(norm);
19
- }
20
- return out;
21
- }
22
- function intersectWithSkillRoots(candidates, skillRoots) {
23
- if (skillRoots.length === 0)
24
- return [...candidates];
25
- return candidates.filter((c) => skillRoots.some((s) => isPathUnderRoot(c, s)));
26
- }
27
8
  function proposeTmvcRoots(input, skillRoots) {
28
- const hinted = [...intentPathTokens(input.intent), ...(input.paths ?? []).map(normalizeContractPath)];
29
- const existing = [...new Set(hinted)].filter((p) => existsRepoPath(input.root, p.replace(/\/$/, ""))).sort();
30
- const narrowed = intersectWithSkillRoots(existing, skillRoots);
9
+ const narrowed = existingHintedPaths(input.root, input.intent, input.paths, skillRoots);
31
10
  if (narrowed.length > 0) {
32
11
  return {
33
12
  roots: narrowed,
@@ -1 +1 @@
1
- {"version":3,"file":"propose.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propose.js","sourceRoot":"","sources":["../../../../src/cli/lib/contract/propose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type PreflightProvider, type PreflightResult } from "./contract/preflight.js";
2
+ import { type McpErrorBody } from "./mcp-governance-shared.js";
3
+ export interface PreflightContractMcpInput {
4
+ intent: string;
5
+ paths?: string[];
6
+ provider?: PreflightProvider;
7
+ }
8
+ export type PreflightContractMcpResult = ({
9
+ status: "ok";
10
+ } & PreflightResult) | {
11
+ status: "error";
12
+ error: McpErrorBody;
13
+ };
14
+ /** Advisory. Never writes mission law. Fail-open Jev errors become heuristic results. */
15
+ export declare function handlePreflightContract(input: PreflightContractMcpInput, deps?: {
16
+ fetchImpl?: typeof fetch;
17
+ apiKey?: string;
18
+ }): Promise<PreflightContractMcpResult>;
19
+ //# sourceMappingURL=mcp-preflight-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-preflight-contract.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/mcp-preflight-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGrG,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGzE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,MAAM,0BAA0B,GAClC,CAAC;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAAG,eAAe,CAAC,GACpC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAE7C,yFAAyF;AACzF,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,yBAAyB,EAChC,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,0BAA0B,CAAC,CAsBrC"}
@@ -0,0 +1,31 @@
1
+ import { runPreflight } from "./contract/preflight.js";
2
+ import { TYPESAFE_API_KEY_ENV } from "./contract/preflight-jev.js";
3
+ import { isGantryUserError } from "./errors.js";
4
+ import { mcpError } from "./mcp-governance-shared.js";
5
+ import { loadWorkspace } from "./workspace.js";
6
+ /** Advisory. Never writes mission law. Fail-open Jev errors become heuristic results. */
7
+ export async function handlePreflightContract(input, deps) {
8
+ try {
9
+ if (!input.intent?.trim()) {
10
+ return mcpError("VALIDATION_ERROR", "intent is required", true);
11
+ }
12
+ const { root, manifest } = loadWorkspace();
13
+ const result = await runPreflight({
14
+ root,
15
+ manifest,
16
+ intent: input.intent.trim(),
17
+ paths: input.paths,
18
+ provider: input.provider,
19
+ apiKey: deps?.apiKey ?? process.env[TYPESAFE_API_KEY_ENV],
20
+ fetchImpl: deps?.fetchImpl,
21
+ });
22
+ return { status: "ok", ...result };
23
+ }
24
+ catch (e) {
25
+ if (isGantryUserError(e)) {
26
+ return mcpError(e.code, e.message, true);
27
+ }
28
+ return mcpError("INTERNAL_ERROR", e instanceof Error ? e.message : String(e), false);
29
+ }
30
+ }
31
+ //# sourceMappingURL=mcp-preflight-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-preflight-contract.js","sourceRoot":"","sources":["../../../src/cli/lib/mcp-preflight-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgD,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAqB,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAY/C,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAgC,EAChC,IAAoD;IAEpD,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,IAAI;YACJ,QAAQ;YACR,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;YAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;YACzD,SAAS,EAAE,IAAI,EAAE,SAAS;SAC3B,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,QAAQ,CAAC,gBAAgB,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvF,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tools-register.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/mcp-tools-register.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoVzE,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqB3D"}
1
+ {"version":3,"file":"mcp-tools-register.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/mcp-tools-register.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkWzE,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsB3D"}
@@ -3,6 +3,7 @@ import { INTERROGATION_FINDING_KINDS } from "./interrogate/findings.js";
3
3
  import { handleCheckSignature } from "./mcp-check-signature.js";
4
4
  import { handleDraftLegislation } from "./mcp-draft-legislation.js";
5
5
  import { handleProposeContract } from "./mcp-propose-contract.js";
6
+ import { handlePreflightContract } from "./mcp-preflight-contract.js";
6
7
  import { handleInterrogate } from "./mcp-interrogate.js";
7
8
  import { handleExecuteLegislation } from "./mcp-execute-legislation.js";
8
9
  import { handleAttest, handleLastError, handlePinMission, handleResolveMission, handleRuntimeEnv, handleRuntimeExec, handleScan, handleVerify, } from "./mcp-runtime.js";
@@ -73,6 +74,13 @@ function registerGxtProposeContractTool(server) {
73
74
  paths: z.array(z.string()).optional().describe("Declared path hints"),
74
75
  }, async (args) => jsonText(handleProposeContract(args)));
75
76
  }
77
+ function registerGxtPreflightContractTool(server) {
78
+ server.tool("gxt_preflight_contract", "Experimental advisory classifier (heuristic default; optional Jev). Returns skill_key hints and tmvc_root_candidates. Never writes a contract. Call gxt_propose_contract next.", {
79
+ intent: z.string().describe("Planner intent / story"),
80
+ paths: z.array(z.string()).optional().describe("Declared path hints"),
81
+ provider: z.enum(["heuristic", "jev"]).optional().describe("heuristic (default, offline) or jev (requires TYPESAFE_API_KEY)"),
82
+ }, async (args) => jsonText(await handlePreflightContract(args)));
83
+ }
76
84
  function registerGxtExecuteLegislationTool(server) {
77
85
  server.tool("gxt_execute_legislation", "Execute gantry legislate using a valid draft_token after explicit human chat approval.", {
78
86
  draft_token: z.string().describe("Token from gxt_draft_legislation"),
@@ -190,6 +198,7 @@ function registerGxtUpgradeApplyTool(server) {
190
198
  export function registerGxtMcpTools(server) {
191
199
  registerGxtInterrogateTool(server);
192
200
  registerGxtProposeContractTool(server);
201
+ registerGxtPreflightContractTool(server);
193
202
  registerGxtDraftLegislationTool(server);
194
203
  registerGxtExecuteLegislationTool(server);
195
204
  registerGxtCheckSignatureTool(server);