@osva-ai/cli 1.1.0-rc.1 → 1.1.0-rc.2

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 (196) hide show
  1. package/README.md +178 -0
  2. package/dist/bin/osva.js +83 -5
  3. package/dist/bin/osva.js.map +1 -1
  4. package/dist/commands/index.js +13 -1
  5. package/dist/commands/index.js.map +1 -1
  6. package/dist/doctor/format.d.ts +4 -0
  7. package/dist/doctor/format.d.ts.map +1 -0
  8. package/dist/doctor/format.js +18 -0
  9. package/dist/doctor/format.js.map +1 -0
  10. package/dist/doctor/http-probe.d.ts +17 -0
  11. package/dist/doctor/http-probe.d.ts.map +1 -0
  12. package/dist/doctor/http-probe.js +104 -0
  13. package/dist/doctor/http-probe.js.map +1 -0
  14. package/dist/doctor/index.d.ts +7 -0
  15. package/dist/doctor/index.d.ts.map +1 -0
  16. package/dist/doctor/index.js +15 -0
  17. package/dist/doctor/index.js.map +1 -0
  18. package/dist/doctor/read-env.d.ts +3 -0
  19. package/dist/doctor/read-env.d.ts.map +1 -0
  20. package/dist/doctor/read-env.js +27 -0
  21. package/dist/doctor/read-env.js.map +1 -0
  22. package/dist/doctor/redact.d.ts +2 -0
  23. package/dist/doctor/redact.d.ts.map +1 -0
  24. package/dist/doctor/redact.js +10 -0
  25. package/dist/doctor/redact.js.map +1 -0
  26. package/dist/doctor/run-doctor.d.ts +6 -0
  27. package/dist/doctor/run-doctor.d.ts.map +1 -0
  28. package/dist/doctor/run-doctor.js +250 -0
  29. package/dist/doctor/run-doctor.js.map +1 -0
  30. package/dist/doctor/types.d.ts +22 -0
  31. package/dist/doctor/types.d.ts.map +1 -0
  32. package/dist/doctor/types.js +2 -0
  33. package/dist/doctor/types.js.map +1 -0
  34. package/dist/exit.d.ts +7 -0
  35. package/dist/exit.d.ts.map +1 -0
  36. package/dist/exit.js +9 -0
  37. package/dist/exit.js.map +1 -0
  38. package/dist/init/index.d.ts +7 -0
  39. package/dist/init/index.d.ts.map +1 -0
  40. package/dist/init/index.js +40 -0
  41. package/dist/init/index.js.map +1 -0
  42. package/dist/init/resolve-target.d.ts +2 -0
  43. package/dist/init/resolve-target.d.ts.map +1 -0
  44. package/dist/init/resolve-target.js +15 -0
  45. package/dist/init/resolve-target.js.map +1 -0
  46. package/dist/init/run-init.d.ts +6 -0
  47. package/dist/init/run-init.d.ts.map +1 -0
  48. package/dist/init/run-init.js +34 -0
  49. package/dist/init/run-init.js.map +1 -0
  50. package/dist/init/scaffold.d.ts +6 -0
  51. package/dist/init/scaffold.d.ts.map +1 -0
  52. package/dist/init/scaffold.js +66 -0
  53. package/dist/init/scaffold.js.map +1 -0
  54. package/dist/init/template-root.d.ts +3 -0
  55. package/dist/init/template-root.d.ts.map +1 -0
  56. package/dist/init/template-root.js +8 -0
  57. package/dist/init/template-root.js.map +1 -0
  58. package/dist/init/template-vars.d.ts +4 -0
  59. package/dist/init/template-vars.d.ts.map +1 -0
  60. package/dist/init/template-vars.js +18 -0
  61. package/dist/init/template-vars.js.map +1 -0
  62. package/dist/init/types.d.ts +18 -0
  63. package/dist/init/types.d.ts.map +1 -0
  64. package/dist/init/types.js +2 -0
  65. package/dist/init/types.js.map +1 -0
  66. package/dist/init/validate-project-name.d.ts +3 -0
  67. package/dist/init/validate-project-name.d.ts.map +1 -0
  68. package/dist/init/validate-project-name.js +26 -0
  69. package/dist/init/validate-project-name.js.map +1 -0
  70. package/dist/project/compose-volume.d.ts +11 -0
  71. package/dist/project/compose-volume.d.ts.map +1 -0
  72. package/dist/project/compose-volume.js +66 -0
  73. package/dist/project/compose-volume.js.map +1 -0
  74. package/dist/project/deploy-env.d.ts +12 -0
  75. package/dist/project/deploy-env.d.ts.map +1 -0
  76. package/dist/project/deploy-env.js +50 -0
  77. package/dist/project/deploy-env.js.map +1 -0
  78. package/dist/project/ensure-agent-version.d.ts +17 -0
  79. package/dist/project/ensure-agent-version.d.ts.map +1 -0
  80. package/dist/project/ensure-agent-version.js +105 -0
  81. package/dist/project/ensure-agent-version.js.map +1 -0
  82. package/dist/project/errors.d.ts +10 -0
  83. package/dist/project/errors.d.ts.map +1 -0
  84. package/dist/project/errors.js +19 -0
  85. package/dist/project/errors.js.map +1 -0
  86. package/dist/project/format.d.ts +42 -0
  87. package/dist/project/format.d.ts.map +1 -0
  88. package/dist/project/format.js +66 -0
  89. package/dist/project/format.js.map +1 -0
  90. package/dist/project/index.d.ts +5 -0
  91. package/dist/project/index.d.ts.map +1 -0
  92. package/dist/project/index.js +101 -0
  93. package/dist/project/index.js.map +1 -0
  94. package/dist/project/install-trusted-runtime.d.ts +14 -0
  95. package/dist/project/install-trusted-runtime.d.ts.map +1 -0
  96. package/dist/project/install-trusted-runtime.js +82 -0
  97. package/dist/project/install-trusted-runtime.js.map +1 -0
  98. package/dist/project/load-manifest.d.ts +3 -0
  99. package/dist/project/load-manifest.d.ts.map +1 -0
  100. package/dist/project/load-manifest.js +13 -0
  101. package/dist/project/load-manifest.js.map +1 -0
  102. package/dist/project/manifest.d.ts +4 -0
  103. package/dist/project/manifest.d.ts.map +1 -0
  104. package/dist/project/manifest.js +12 -0
  105. package/dist/project/manifest.js.map +1 -0
  106. package/dist/project/parse-run-input.d.ts +6 -0
  107. package/dist/project/parse-run-input.d.ts.map +1 -0
  108. package/dist/project/parse-run-input.js +43 -0
  109. package/dist/project/parse-run-input.js.map +1 -0
  110. package/dist/project/poll.d.ts +15 -0
  111. package/dist/project/poll.d.ts.map +1 -0
  112. package/dist/project/poll.js +32 -0
  113. package/dist/project/poll.js.map +1 -0
  114. package/dist/project/run-deploy.d.ts +16 -0
  115. package/dist/project/run-deploy.d.ts.map +1 -0
  116. package/dist/project/run-deploy.js +142 -0
  117. package/dist/project/run-deploy.js.map +1 -0
  118. package/dist/project/run-run.d.ts +17 -0
  119. package/dist/project/run-run.d.ts.map +1 -0
  120. package/dist/project/run-run.js +203 -0
  121. package/dist/project/run-run.js.map +1 -0
  122. package/dist/project/run-status.d.ts +15 -0
  123. package/dist/project/run-status.d.ts.map +1 -0
  124. package/dist/project/run-status.js +122 -0
  125. package/dist/project/run-status.js.map +1 -0
  126. package/dist/project/sdk-error.d.ts +10 -0
  127. package/dist/project/sdk-error.d.ts.map +1 -0
  128. package/dist/project/sdk-error.js +49 -0
  129. package/dist/project/sdk-error.js.map +1 -0
  130. package/dist/project/state.d.ts +28 -0
  131. package/dist/project/state.d.ts.map +1 -0
  132. package/dist/project/state.js +54 -0
  133. package/dist/project/state.js.map +1 -0
  134. package/dist/project/workspace-context.d.ts +6 -0
  135. package/dist/project/workspace-context.d.ts.map +1 -0
  136. package/dist/project/workspace-context.js +25 -0
  137. package/dist/project/workspace-context.js.map +1 -0
  138. package/dist/stdout.d.ts +3 -0
  139. package/dist/stdout.d.ts.map +1 -0
  140. package/dist/stdout.js +27 -0
  141. package/dist/stdout.js.map +1 -0
  142. package/dist/tsconfig.tsbuildinfo +1 -1
  143. package/dist/validate/canonical-json.d.ts +2 -0
  144. package/dist/validate/canonical-json.d.ts.map +1 -0
  145. package/dist/validate/canonical-json.js +17 -0
  146. package/dist/validate/canonical-json.js.map +1 -0
  147. package/dist/validate/exit-code.d.ts +3 -0
  148. package/dist/validate/exit-code.d.ts.map +1 -0
  149. package/dist/validate/exit-code.js +4 -0
  150. package/dist/validate/exit-code.js.map +1 -0
  151. package/dist/validate/format.d.ts +4 -0
  152. package/dist/validate/format.d.ts.map +1 -0
  153. package/dist/validate/format.js +23 -0
  154. package/dist/validate/format.js.map +1 -0
  155. package/dist/validate/index.d.ts +6 -0
  156. package/dist/validate/index.d.ts.map +1 -0
  157. package/dist/validate/index.js +29 -0
  158. package/dist/validate/index.js.map +1 -0
  159. package/dist/validate/integrity.d.ts +4 -0
  160. package/dist/validate/integrity.d.ts.map +1 -0
  161. package/dist/validate/integrity.js +24 -0
  162. package/dist/validate/integrity.js.map +1 -0
  163. package/dist/validate/json-schema-draft.d.ts +8 -0
  164. package/dist/validate/json-schema-draft.d.ts.map +1 -0
  165. package/dist/validate/json-schema-draft.js +32 -0
  166. package/dist/validate/json-schema-draft.js.map +1 -0
  167. package/dist/validate/project-config.d.ts +24 -0
  168. package/dist/validate/project-config.d.ts.map +1 -0
  169. package/dist/validate/project-config.js +27 -0
  170. package/dist/validate/project-config.js.map +1 -0
  171. package/dist/validate/resolve-project-dir.d.ts +12 -0
  172. package/dist/validate/resolve-project-dir.d.ts.map +1 -0
  173. package/dist/validate/resolve-project-dir.js +27 -0
  174. package/dist/validate/resolve-project-dir.js.map +1 -0
  175. package/dist/validate/run-validate.d.ts +3 -0
  176. package/dist/validate/run-validate.d.ts.map +1 -0
  177. package/dist/validate/run-validate.js +278 -0
  178. package/dist/validate/run-validate.js.map +1 -0
  179. package/dist/validate/safe-path.d.ts +4 -0
  180. package/dist/validate/safe-path.d.ts.map +1 -0
  181. package/dist/validate/safe-path.js +42 -0
  182. package/dist/validate/safe-path.js.map +1 -0
  183. package/dist/validate/types.d.ts +14 -0
  184. package/dist/validate/types.d.ts.map +1 -0
  185. package/dist/validate/types.js +2 -0
  186. package/dist/validate/types.js.map +1 -0
  187. package/package.json +6 -3
  188. package/templates/agent-typescript/.gitignore +4 -0
  189. package/templates/agent-typescript/README.md.template +56 -0
  190. package/templates/agent-typescript/agent/agent.ts.template +25 -0
  191. package/templates/agent-typescript/contracts/input.v1.schema.json +12 -0
  192. package/templates/agent-typescript/contracts/output.v1.schema.json +12 -0
  193. package/templates/agent-typescript/osva-agent.project.json.template +21 -0
  194. package/templates/agent-typescript/package.json.template +16 -0
  195. package/templates/agent-typescript/scripts/build-manifest.mjs +53 -0
  196. package/templates/agent-typescript/tsconfig.json +19 -0
@@ -0,0 +1,17 @@
1
+ export function canonicalJson(value) {
2
+ return JSON.stringify(sortKeys(value));
3
+ }
4
+ function sortKeys(value) {
5
+ if (value === null || typeof value !== "object") {
6
+ return value;
7
+ }
8
+ if (Array.isArray(value)) {
9
+ return value.map(sortKeys);
10
+ }
11
+ const sorted = {};
12
+ for (const key of Object.keys(value).sort()) {
13
+ sorted[key] = sortKeys(value[key]);
14
+ }
15
+ return sorted;
16
+ }
17
+ //# sourceMappingURL=canonical-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../src/validate/canonical-json.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ValidateReport } from "./types.js";
2
+ export declare function validateExitCode(report: ValidateReport): number;
3
+ //# sourceMappingURL=exit-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-code.d.ts","sourceRoot":"","sources":["../../src/validate/exit-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,4 @@
1
+ export function validateExitCode(report) {
2
+ return report.result === "fail" ? 1 : 0;
3
+ }
4
+ //# sourceMappingURL=exit-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-code.js","sourceRoot":"","sources":["../../src/validate/exit-code.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,OAAO,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ValidateReport } from "./types.js";
2
+ export declare function formatValidateHuman(report: ValidateReport): string;
3
+ export declare function formatValidateJson(report: ValidateReport): string;
4
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/validate/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAkBlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,23 @@
1
+ export function formatValidateHuman(report) {
2
+ const lines = [
3
+ "OSVA Validate",
4
+ "",
5
+ `Project: ${report.projectDir}`,
6
+ "",
7
+ ];
8
+ for (const check of report.checks) {
9
+ const status = check.status.padEnd(4, " ");
10
+ const id = check.id.padEnd(28, " ");
11
+ lines.push(`${status} ${id} ${check.message}`);
12
+ if (check.remediation !== undefined) {
13
+ lines.push(` → ${check.remediation}`);
14
+ }
15
+ }
16
+ lines.push("");
17
+ lines.push(`Result: ${report.result.toUpperCase()}`);
18
+ return `${lines.join("\n")}\n`;
19
+ }
20
+ export function formatValidateJson(report) {
21
+ return `${JSON.stringify(report, null, 2)}\n`;
22
+ }
23
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/validate/format.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,MAAM,KAAK,GAAa;QACtB,eAAe;QACf,EAAE;QACF,YAAY,MAAM,CAAC,UAAU,EAAE;QAC/B,EAAE;KACH,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { ValidateCheck, ValidateReport } from "./types.js";
2
+ export { validateExitCode } from "./exit-code.js";
3
+ export { runValidatePipeline } from "./run-validate.js";
4
+ export { resolveValidateProjectDir } from "./resolve-project-dir.js";
5
+ export declare function runValidateCommand(flags: Readonly<Record<string, string | boolean>>, cwd?: string): Promise<number>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAOA,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EACjD,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -0,0 +1,29 @@
1
+ import { writeStdout } from "../stdout.js";
2
+ import { validateExitCode } from "./exit-code.js";
3
+ import { formatValidateHuman, formatValidateJson } from "./format.js";
4
+ import { resolveValidateProjectDir } from "./resolve-project-dir.js";
5
+ import { runValidatePipeline } from "./run-validate.js";
6
+ export { validateExitCode } from "./exit-code.js";
7
+ export { runValidatePipeline } from "./run-validate.js";
8
+ export { resolveValidateProjectDir } from "./resolve-project-dir.js";
9
+ export async function runValidateCommand(flags, cwd = process.cwd()) {
10
+ const json = flags.json === true;
11
+ const resolved = await resolveValidateProjectDir({ cwd, flags });
12
+ const report = resolved.ok
13
+ ? await runValidatePipeline(resolved.projectDir)
14
+ : {
15
+ result: "fail",
16
+ projectDir: resolved.projectDir,
17
+ checks: [
18
+ {
19
+ id: "project_directory",
20
+ status: "FAIL",
21
+ message: resolved.error,
22
+ remediation: "Use --project to point at an osva init scaffold directory.",
23
+ },
24
+ ],
25
+ };
26
+ await writeStdout(json ? formatValidateJson(report) : formatValidateHuman(report));
27
+ return validateExitCode(report);
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAiD,EACjD,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAmB,QAAQ,CAAC,EAAE;QACxC,CAAC,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAChD,CAAC,CAAC;YACE,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE;gBACN;oBACE,EAAE,EAAE,mBAAmB;oBACvB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,QAAQ,CAAC,KAAK;oBACvB,WAAW,EACT,4DAA4D;iBAC/D;aACF;SACF,CAAC;IAEN,MAAM,WAAW,CACf,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAChE,CAAC;IACF,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function sha256IntegrityOf(content: Buffer | string): string;
2
+ export declare function sha256IntegrityOfFile(filePath: string): Promise<string>;
3
+ export declare function normalizeIntegrityDigest(value: string): string | undefined;
4
+ //# sourceMappingURL=integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../../src/validate/integrity.ts"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAKlE;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS1E"}
@@ -0,0 +1,24 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { SHA256_INTEGRITY_PREFIX } from "@osva-ai/contracts";
4
+ export function sha256IntegrityOf(content) {
5
+ return `${SHA256_INTEGRITY_PREFIX}${createHash("sha256")
6
+ .update(content)
7
+ .digest("hex")
8
+ .toLowerCase()}`;
9
+ }
10
+ export async function sha256IntegrityOfFile(filePath) {
11
+ const bytes = await readFile(filePath);
12
+ return sha256IntegrityOf(bytes);
13
+ }
14
+ export function normalizeIntegrityDigest(value) {
15
+ if (!value.startsWith(SHA256_INTEGRITY_PREFIX)) {
16
+ return undefined;
17
+ }
18
+ const hex = value.slice(SHA256_INTEGRITY_PREFIX.length);
19
+ if (!/^[0-9a-fA-F]{64}$/.test(hex)) {
20
+ return undefined;
21
+ }
22
+ return `${SHA256_INTEGRITY_PREFIX}${hex.toLowerCase()}`;
23
+ }
24
+ //# sourceMappingURL=integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../src/validate/integrity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,OAAO,GAAG,uBAAuB,GAAG,UAAU,CAAC,QAAQ,CAAC;SACrD,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,KAAK,CAAC;SACb,WAAW,EAAE,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,uBAAuB,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const SUPPORTED_JSON_SCHEMA_DRAFT: "https://json-schema.org/draft/2020-12/schema";
2
+ export interface JsonSchemaDraftValidation {
3
+ readonly ok: boolean;
4
+ readonly warnMissingSchema?: boolean;
5
+ readonly error?: string;
6
+ }
7
+ export declare function validateJsonSchemaDocument(schema: unknown, label: string): JsonSchemaDraftValidation;
8
+ //# sourceMappingURL=json-schema-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-draft.d.ts","sourceRoot":"","sources":["../../src/validate/json-schema-draft.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,2BAA2B,EACtC,8CAAuD,CAAC;AAc1D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,yBAAyB,CA4B3B"}
@@ -0,0 +1,32 @@
1
+ import Ajv2020Import from "ajv/dist/2020.js";
2
+ export const SUPPORTED_JSON_SCHEMA_DRAFT = "https://json-schema.org/draft/2020-12/schema";
3
+ const Ajv2020 = Ajv2020Import;
4
+ const ajv = new Ajv2020({ allErrors: true, strict: true });
5
+ export function validateJsonSchemaDocument(schema, label) {
6
+ if (typeof schema !== "object" || schema === null) {
7
+ return { ok: false, error: `${label} must be a JSON object.` };
8
+ }
9
+ const record = schema;
10
+ const declared = record.$schema;
11
+ let warnMissingSchema = false;
12
+ if (declared === undefined) {
13
+ warnMissingSchema = true;
14
+ }
15
+ else if (declared !== SUPPORTED_JSON_SCHEMA_DRAFT) {
16
+ return {
17
+ ok: false,
18
+ error: `${label} $schema must be ${SUPPORTED_JSON_SCHEMA_DRAFT}.`,
19
+ };
20
+ }
21
+ try {
22
+ ajv.compile(schema);
23
+ }
24
+ catch (error) {
25
+ const message = error instanceof Error ? error.message : "Invalid JSON Schema document.";
26
+ return { ok: false, error: `${label}: ${message}` };
27
+ }
28
+ return warnMissingSchema
29
+ ? { ok: true, warnMissingSchema: true }
30
+ : { ok: true };
31
+ }
32
+ //# sourceMappingURL=json-schema-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-draft.js","sourceRoot":"","sources":["../../src/validate/json-schema-draft.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAG7C,MAAM,CAAC,MAAM,2BAA2B,GACtC,8CAAuD,CAAC;AAU1D,MAAM,OAAO,GAAG,aAA0C,CAAC;AAE3D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAQ3D,MAAM,UAAU,0BAA0B,CACxC,MAAe,EACf,KAAa;IAEb,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,yBAAyB,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,iBAAiB,GAAG,IAAI,CAAC;IAC3B,CAAC;SAAM,IAAI,QAAQ,KAAK,2BAA2B,EAAE,CAAC;QACpD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,KAAK,oBAAoB,2BAA2B,GAAG;SAClE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,GAAG,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,KAAK,OAAO,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,iBAAiB;QACtB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE;QACvC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ export declare const osvaAgentProjectSchema: z.ZodObject<{
3
+ schemaVersion: z.ZodLiteral<"1">;
4
+ key: z.ZodString;
5
+ name: z.ZodString;
6
+ runtime: z.ZodObject<{
7
+ type: z.ZodLiteral<"TRUSTED_TYPESCRIPT">;
8
+ entrypoint: z.ZodString;
9
+ }, z.core.$strict>;
10
+ execution: z.ZodObject<{
11
+ timeoutMs: z.ZodInt;
12
+ maxAttempts: z.ZodInt;
13
+ }, z.core.$strict>;
14
+ capabilities: z.ZodObject<{
15
+ model: z.ZodBoolean;
16
+ tools: z.ZodArray<z.ZodString>;
17
+ }, z.core.$strict>;
18
+ contracts: z.ZodObject<{
19
+ input: z.ZodString;
20
+ output: z.ZodString;
21
+ }, z.core.$strict>;
22
+ }, z.core.$strict>;
23
+ export type OsvaAgentProject = z.infer<typeof osvaAgentProjectSchema>;
24
+ //# sourceMappingURL=project-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/validate/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;kBAuBjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import { AGENT_EXECUTION_MAX_TIMEOUT_MS, AGENT_EXECUTION_MIN_TIMEOUT_MS, } from "@osva-ai/contracts";
3
+ export const osvaAgentProjectSchema = z.strictObject({
4
+ schemaVersion: z.literal("1"),
5
+ key: z.string().min(1),
6
+ name: z.string().min(1),
7
+ runtime: z.strictObject({
8
+ type: z.literal("TRUSTED_TYPESCRIPT"),
9
+ entrypoint: z.string().min(1),
10
+ }),
11
+ execution: z.strictObject({
12
+ timeoutMs: z
13
+ .int()
14
+ .min(AGENT_EXECUTION_MIN_TIMEOUT_MS)
15
+ .max(AGENT_EXECUTION_MAX_TIMEOUT_MS),
16
+ maxAttempts: z.int().min(1),
17
+ }),
18
+ capabilities: z.strictObject({
19
+ model: z.boolean(),
20
+ tools: z.array(z.string().min(1)),
21
+ }),
22
+ contracts: z.strictObject({
23
+ input: z.string().min(1),
24
+ output: z.string().min(1),
25
+ }),
26
+ });
27
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/validate/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,YAAY,CAAC;IACnD,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC9B,CAAC;IACF,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC;QACxB,SAAS,EAAE,CAAC;aACT,GAAG,EAAE;aACL,GAAG,CAAC,8BAA8B,CAAC;aACnC,GAAG,CAAC,8BAA8B,CAAC;QACtC,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC5B,CAAC;IACF,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;QAC3B,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC;QACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC1B,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function resolveValidateProjectDir(input: {
2
+ readonly cwd: string;
3
+ readonly flags: Readonly<Record<string, string | boolean>>;
4
+ }): Promise<{
5
+ ok: true;
6
+ projectDir: string;
7
+ } | {
8
+ ok: false;
9
+ error: string;
10
+ projectDir: string;
11
+ }>;
12
+ //# sourceMappingURL=resolve-project-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-project-dir.d.ts","sourceRoot":"","sources":["../../src/validate/resolve-project-dir.ts"],"names":[],"mappings":"AAGA,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IACrD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAC5D,GAAG,OAAO,CACP;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CACnD,CAyBA"}
@@ -0,0 +1,27 @@
1
+ import { stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function resolveValidateProjectDir(input) {
4
+ const projectFlag = input.flags.project;
5
+ const projectDir = typeof projectFlag === "string" && projectFlag.length > 0
6
+ ? path.resolve(input.cwd, projectFlag)
7
+ : path.resolve(input.cwd);
8
+ try {
9
+ const info = await stat(projectDir);
10
+ if (!info.isDirectory()) {
11
+ return {
12
+ ok: false,
13
+ projectDir,
14
+ error: `Project path is not a directory: ${projectDir}`,
15
+ };
16
+ }
17
+ }
18
+ catch {
19
+ return {
20
+ ok: false,
21
+ projectDir,
22
+ error: `Project directory does not exist: ${projectDir}`,
23
+ };
24
+ }
25
+ return { ok: true, projectDir };
26
+ }
27
+ //# sourceMappingURL=resolve-project-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-project-dir.js","sourceRoot":"","sources":["../../src/validate/resolve-project-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAG/C;IAIC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;IACxC,MAAM,UAAU,GACd,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,UAAU;gBACV,KAAK,EAAE,oCAAoC,UAAU,EAAE;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU;YACV,KAAK,EAAE,qCAAqC,UAAU,EAAE;SACzD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ValidateReport } from "./types.js";
2
+ export declare function runValidatePipeline(projectDir: string): Promise<ValidateReport>;
3
+ //# sourceMappingURL=run-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-validate.d.ts","sourceRoot":"","sources":["../../src/validate/run-validate.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,YAAY,CAAC;AAKhE,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,CAuKzB"}
@@ -0,0 +1,278 @@
1
+ import { readFile, realpath, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { isRelativeTrustedEntrypoint } from "@osva-ai/contracts";
4
+ import { agentManifestSchema } from "@osva-ai/contracts/schemas";
5
+ import { canonicalJson } from "./canonical-json.js";
6
+ import { sha256IntegrityOfFile, normalizeIntegrityDigest, } from "./integrity.js";
7
+ import { validateJsonSchemaDocument } from "./json-schema-draft.js";
8
+ import { osvaAgentProjectSchema, } from "./project-config.js";
9
+ import { redactSecrets } from "../doctor/redact.js";
10
+ import { isInsideRoot, isSafeProjectRelativePath, resolvePathInsideRoot, } from "./safe-path.js";
11
+ const BUILD_REMEDIATION = "Run npm run build, then npm run manifest.";
12
+ const MANIFEST_REMEDIATION = "Run npm run manifest after npm run build.";
13
+ export async function runValidatePipeline(projectDir) {
14
+ const checks = [];
15
+ checks.push(passCheck("project_directory", `Using project directory ${projectDir}.`));
16
+ let projectConfig;
17
+ const projectConfigPath = path.join(projectDir, "osva-agent.project.json");
18
+ try {
19
+ const raw = await readFile(projectConfigPath, "utf8");
20
+ const parsed = osvaAgentProjectSchema.safeParse(JSON.parse(raw));
21
+ if (!parsed.success) {
22
+ checks.push(failCheck("project_config", "osva-agent.project.json is invalid.", "Fix the project configuration file or re-run osva init."));
23
+ return finalizeReport(projectDir, checks);
24
+ }
25
+ projectConfig = parsed.data;
26
+ checks.push(passCheck("project_config", "osva-agent.project.json parsed successfully."));
27
+ }
28
+ catch (error) {
29
+ const message = error instanceof Error &&
30
+ "code" in error &&
31
+ error.code === "ENOENT"
32
+ ? "osva-agent.project.json was not found."
33
+ : "osva-agent.project.json could not be read.";
34
+ checks.push(failCheck("project_config", message, "Run osva init in this directory or use --project to point at a scaffold."));
35
+ return finalizeReport(projectDir, checks);
36
+ }
37
+ const contractChecks = await validateContractPaths(projectDir, projectConfig);
38
+ checks.push(...contractChecks);
39
+ if (contractChecks.some((check) => check.status === "FAIL")) {
40
+ return finalizeReport(projectDir, checks);
41
+ }
42
+ const manifestPath = path.join(projectDir, "osva.manifest.json");
43
+ let manifestRaw;
44
+ try {
45
+ manifestRaw = await readFile(manifestPath, "utf8");
46
+ checks.push(passCheck("manifest_file", "osva.manifest.json is present."));
47
+ }
48
+ catch (error) {
49
+ void error;
50
+ checks.push(failCheck("manifest_file", "osva.manifest.json was not found.", MANIFEST_REMEDIATION));
51
+ return finalizeReport(projectDir, checks);
52
+ }
53
+ let manifestParsed;
54
+ try {
55
+ manifestParsed = JSON.parse(manifestRaw);
56
+ }
57
+ catch {
58
+ checks.push(failCheck("manifest_file", "osva.manifest.json is not valid JSON.", MANIFEST_REMEDIATION));
59
+ return finalizeReport(projectDir, checks);
60
+ }
61
+ const manifestSchemaResult = agentManifestSchema.safeParse(manifestParsed);
62
+ if (!manifestSchemaResult.success) {
63
+ checks.push(failCheck("manifest_schema", "osva.manifest.json does not satisfy AgentManifestV1.", MANIFEST_REMEDIATION));
64
+ return finalizeReport(projectDir, checks);
65
+ }
66
+ const manifest = manifestSchemaResult.data;
67
+ checks.push(passCheck("manifest_schema", "osva.manifest.json satisfies AgentManifestV1."));
68
+ if (manifest.runtime.type !== "TRUSTED_TYPESCRIPT") {
69
+ checks.push(failCheck("runtime_type", `Manifest runtime type must be TRUSTED_TYPESCRIPT (found ${manifest.runtime.type}).`, MANIFEST_REMEDIATION));
70
+ return finalizeReport(projectDir, checks);
71
+ }
72
+ checks.push(passCheck("runtime_type", "Manifest runtime type is TRUSTED_TYPESCRIPT."));
73
+ const entrypoint = manifest.runtime.entrypoint;
74
+ if (!isRelativeTrustedEntrypoint(entrypoint)) {
75
+ checks.push(failCheck("runtime_entrypoint", "Manifest runtime.entrypoint must be a safe relative POSIX path.", MANIFEST_REMEDIATION));
76
+ return finalizeReport(projectDir, checks);
77
+ }
78
+ checks.push(passCheck("runtime_entrypoint", `Manifest entrypoint "${entrypoint}" is a valid trusted runtime path.`));
79
+ const artifactCheck = await validateBuildArtifact(projectDir, entrypoint);
80
+ checks.push(artifactCheck);
81
+ if (artifactCheck.status === "FAIL") {
82
+ return finalizeReport(projectDir, checks);
83
+ }
84
+ const artifactPath = resolvePathInsideRoot(projectDir, "dist", "agent", entrypoint);
85
+ const integrityCheck = await validateArtifactIntegrity(artifactPath, manifest.runtime.integrity);
86
+ checks.push(integrityCheck);
87
+ const pathSafetyCheck = await validateArtifactPathSafety(projectDir, entrypoint);
88
+ checks.push(pathSafetyCheck);
89
+ checks.push(validateProjectManifestAgreement(projectConfig, manifest));
90
+ const schemaAgreement = await validateContractSchemaAgreement(projectDir, projectConfig, manifest);
91
+ checks.push(schemaAgreement);
92
+ return finalizeReport(projectDir, checks);
93
+ }
94
+ async function validateContractPaths(projectDir, project) {
95
+ const checks = [];
96
+ const pairs = [
97
+ {
98
+ id: "input_schema",
99
+ label: "Input schema",
100
+ relative: project.contracts.input,
101
+ },
102
+ {
103
+ id: "output_schema",
104
+ label: "Output schema",
105
+ relative: project.contracts.output,
106
+ },
107
+ ];
108
+ for (const pair of pairs) {
109
+ if (!isSafeProjectRelativePath(pair.relative)) {
110
+ checks.push(failCheck(pair.id, `${pair.label} path must be a safe relative path.`, "Use paths relative to the project root without .. traversal."));
111
+ continue;
112
+ }
113
+ let schemaPath;
114
+ try {
115
+ schemaPath = resolvePathInsideRoot(projectDir, ...pair.relative.split("/"));
116
+ }
117
+ catch {
118
+ checks.push(failCheck(pair.id, `${pair.label} path escapes the project directory.`, "Fix contracts.input or contracts.output in osva-agent.project.json."));
119
+ continue;
120
+ }
121
+ let schemaRaw;
122
+ try {
123
+ schemaRaw = await readFile(schemaPath, "utf8");
124
+ }
125
+ catch {
126
+ checks.push(failCheck(pair.id, `${pair.label} file is missing at ${pair.relative}.`, "Restore the contract schema file or update osva-agent.project.json."));
127
+ continue;
128
+ }
129
+ let schemaDocument;
130
+ try {
131
+ schemaDocument = JSON.parse(schemaRaw);
132
+ }
133
+ catch {
134
+ checks.push(failCheck(pair.id, `${pair.label} file is not valid JSON.`, `Fix ${pair.relative}.`));
135
+ continue;
136
+ }
137
+ const draftResult = validateJsonSchemaDocument(schemaDocument, pair.label);
138
+ if (!draftResult.ok) {
139
+ checks.push(failCheck(pair.id, redactSecrets(draftResult.error ?? `${pair.label} is invalid.`), `Fix ${pair.relative}.`));
140
+ continue;
141
+ }
142
+ if (draftResult.warnMissingSchema) {
143
+ checks.push(warnCheck(pair.id, `${pair.label} compiled but $schema is missing (expected draft 2020-12).`, `Add "$schema": "https://json-schema.org/draft/2020-12/schema" to ${pair.relative}.`));
144
+ continue;
145
+ }
146
+ checks.push(passCheck(pair.id, `${pair.label} is valid JSON Schema draft 2020-12.`));
147
+ }
148
+ return checks;
149
+ }
150
+ async function validateBuildArtifact(projectDir, entrypoint) {
151
+ let artifactPath;
152
+ try {
153
+ artifactPath = resolvePathInsideRoot(projectDir, "dist", "agent", entrypoint);
154
+ }
155
+ catch {
156
+ return failCheck("build_artifact", "Build artifact path escapes the project directory.", BUILD_REMEDIATION);
157
+ }
158
+ try {
159
+ const info = await stat(artifactPath);
160
+ if (!info.isFile()) {
161
+ return failCheck("build_artifact", `Build artifact at dist/agent/${entrypoint} is not a regular file.`, BUILD_REMEDIATION);
162
+ }
163
+ }
164
+ catch {
165
+ return failCheck("build_artifact", `Build artifact is missing at dist/agent/${entrypoint}.`, BUILD_REMEDIATION);
166
+ }
167
+ return passCheck("build_artifact", `Build artifact dist/agent/${entrypoint} exists.`);
168
+ }
169
+ async function validateArtifactIntegrity(artifactPath, manifestIntegrity) {
170
+ const expected = normalizeIntegrityDigest(manifestIntegrity);
171
+ if (expected === undefined) {
172
+ return failCheck("artifact_integrity", "Manifest runtime.integrity is not a valid sha256 digest.", MANIFEST_REMEDIATION);
173
+ }
174
+ const actual = await sha256IntegrityOfFile(artifactPath);
175
+ if (actual !== expected) {
176
+ return failCheck("artifact_integrity", "Build artifact SHA-256 does not match manifest runtime.integrity.", BUILD_REMEDIATION);
177
+ }
178
+ return passCheck("artifact_integrity", "Build artifact SHA-256 matches manifest runtime.integrity.");
179
+ }
180
+ async function validateArtifactPathSafety(projectDir, entrypoint) {
181
+ let artifactPath;
182
+ let agentDir;
183
+ try {
184
+ agentDir = resolvePathInsideRoot(projectDir, "dist", "agent");
185
+ artifactPath = resolvePathInsideRoot(projectDir, "dist", "agent", entrypoint);
186
+ }
187
+ catch {
188
+ return failCheck("artifact_path_safety", "Artifact path resolution failed.", BUILD_REMEDIATION);
189
+ }
190
+ try {
191
+ const projectReal = await realpath(projectDir);
192
+ const agentDirReal = await realpath(agentDir);
193
+ const artifactReal = await realpath(artifactPath);
194
+ if (!isInsideRoot(projectReal, agentDirReal)) {
195
+ return failCheck("artifact_path_safety", "dist/agent resolves outside the project directory.", BUILD_REMEDIATION);
196
+ }
197
+ if (!isInsideRoot(agentDirReal, artifactReal)) {
198
+ return failCheck("artifact_path_safety", "Build artifact resolves outside dist/agent.", BUILD_REMEDIATION);
199
+ }
200
+ }
201
+ catch {
202
+ return failCheck("artifact_path_safety", "Could not resolve build artifact path safely.", BUILD_REMEDIATION);
203
+ }
204
+ return passCheck("artifact_path_safety", "Build artifact path stays within dist/agent.");
205
+ }
206
+ async function validateContractSchemaAgreement(projectDir, project, manifest) {
207
+ try {
208
+ const inputPath = resolvePathInsideRoot(projectDir, ...project.contracts.input.split("/"));
209
+ const outputPath = resolvePathInsideRoot(projectDir, ...project.contracts.output.split("/"));
210
+ const inputSchema = JSON.parse(await readFile(inputPath, "utf8"));
211
+ const outputSchema = JSON.parse(await readFile(outputPath, "utf8"));
212
+ const mismatches = [];
213
+ if (canonicalJson(inputSchema) !== canonicalJson(manifest.input.schema)) {
214
+ mismatches.push("input schema");
215
+ }
216
+ if (canonicalJson(outputSchema) !== canonicalJson(manifest.output.schema)) {
217
+ mismatches.push("output schema");
218
+ }
219
+ if (mismatches.length > 0) {
220
+ return failCheck("contract_schema_agreement", `Contract files disagree with manifest (${mismatches.join(", ")}).`, MANIFEST_REMEDIATION);
221
+ }
222
+ }
223
+ catch {
224
+ return failCheck("contract_schema_agreement", "Could not compare contract schemas with the manifest.", MANIFEST_REMEDIATION);
225
+ }
226
+ return passCheck("contract_schema_agreement", "Contract schema files match manifest input and output.");
227
+ }
228
+ function validateProjectManifestAgreement(project, manifest) {
229
+ if (manifest.runtime.type !== "TRUSTED_TYPESCRIPT") {
230
+ return failCheck("project_manifest_agreement", "Manifest runtime is not TRUSTED_TYPESCRIPT.", MANIFEST_REMEDIATION);
231
+ }
232
+ const mismatches = [];
233
+ if (project.key !== manifest.key) {
234
+ mismatches.push("key");
235
+ }
236
+ if (project.name !== manifest.name) {
237
+ mismatches.push("name");
238
+ }
239
+ if (project.runtime.entrypoint !== manifest.runtime.entrypoint) {
240
+ mismatches.push("runtime.entrypoint");
241
+ }
242
+ if (canonicalJson(project.execution) !== canonicalJson(manifest.execution)) {
243
+ mismatches.push("execution");
244
+ }
245
+ if (canonicalJson(project.capabilities) !== canonicalJson(manifest.capabilities)) {
246
+ mismatches.push("capabilities");
247
+ }
248
+ if (mismatches.length > 0) {
249
+ return failCheck("project_manifest_agreement", `Project configuration disagrees with manifest (${mismatches.join(", ")}).`, MANIFEST_REMEDIATION);
250
+ }
251
+ return passCheck("project_manifest_agreement", "Project configuration matches manifest identity and runtime settings.");
252
+ }
253
+ function passCheck(id, message) {
254
+ return { id, status: "PASS", message: redactSecrets(message) };
255
+ }
256
+ function warnCheck(id, message, remediation) {
257
+ return {
258
+ id,
259
+ status: "WARN",
260
+ message: redactSecrets(message),
261
+ remediation: redactSecrets(remediation),
262
+ };
263
+ }
264
+ function failCheck(id, message, remediation) {
265
+ return {
266
+ id,
267
+ status: "FAIL",
268
+ message: redactSecrets(message),
269
+ remediation: redactSecrets(remediation),
270
+ };
271
+ }
272
+ function finalizeReport(projectDir, checks) {
273
+ const hasFail = checks.some((check) => check.status === "FAIL");
274
+ const hasWarn = checks.some((check) => check.status === "WARN");
275
+ const result = hasFail ? "fail" : hasWarn ? "warn" : "pass";
276
+ return { result, projectDir, checks };
277
+ }
278
+ //# sourceMappingURL=run-validate.js.map