veryfront 0.1.533 → 0.1.535

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 (112) hide show
  1. package/esm/cli/commands/extension/init-command.d.ts +1 -1
  2. package/esm/cli/commands/extension/init-command.d.ts.map +1 -1
  3. package/esm/cli/commands/extension/init-command.js +14 -4
  4. package/esm/deno.d.ts +1 -0
  5. package/esm/deno.js +5 -4
  6. package/esm/extensions/ext-auth-jwt/src/index.d.ts.map +1 -1
  7. package/esm/extensions/ext-auth-jwt/src/index.js +0 -1
  8. package/esm/extensions/ext-bundler-esbuild/src/index.js +4 -4
  9. package/esm/extensions/ext-content-mdx/src/index.d.ts.map +1 -1
  10. package/esm/extensions/ext-content-mdx/src/index.js +4 -1
  11. package/esm/extensions/ext-css-tailwind/src/index.d.ts.map +1 -1
  12. package/esm/extensions/ext-css-tailwind/src/index.js +3 -1
  13. package/esm/extensions/ext-db-sqlite/src/index.d.ts.map +1 -1
  14. package/esm/extensions/ext-db-sqlite/src/index.js +3 -1
  15. package/esm/extensions/ext-document-kreuzberg/src/index.d.ts.map +1 -1
  16. package/esm/extensions/ext-document-kreuzberg/src/index.js +3 -1
  17. package/esm/extensions/ext-llm-anthropic/src/index.d.ts.map +1 -1
  18. package/esm/extensions/ext-llm-anthropic/src/index.js +5 -1
  19. package/esm/extensions/ext-llm-google/src/index.d.ts.map +1 -1
  20. package/esm/extensions/ext-llm-google/src/index.js +5 -1
  21. package/esm/extensions/ext-llm-openai/src/index.d.ts.map +1 -1
  22. package/esm/extensions/ext-llm-openai/src/index.js +5 -1
  23. package/esm/extensions/ext-observability-opentelemetry/src/index.d.ts.map +1 -1
  24. package/esm/extensions/ext-observability-opentelemetry/src/index.js +3 -2
  25. package/esm/extensions/ext-parser-babel/src/index.d.ts.map +1 -1
  26. package/esm/extensions/ext-parser-babel/src/index.js +4 -1
  27. package/esm/extensions/ext-sandbox-shell-tools/src/index.d.ts.map +1 -1
  28. package/esm/extensions/ext-sandbox-shell-tools/src/index.js +4 -1
  29. package/esm/extensions/ext-schema-zod/src/index.d.ts.map +1 -1
  30. package/esm/extensions/ext-schema-zod/src/index.js +4 -1
  31. package/esm/src/agent/testing/durable-run-canaries/cli-runner.d.ts +18 -0
  32. package/esm/src/agent/testing/durable-run-canaries/cli-runner.d.ts.map +1 -0
  33. package/esm/src/agent/testing/durable-run-canaries/cli-runner.js +65 -0
  34. package/esm/src/agent/testing/durable-run-canaries/environment.d.ts +11 -0
  35. package/esm/src/agent/testing/durable-run-canaries/environment.d.ts.map +1 -0
  36. package/esm/src/agent/testing/durable-run-canaries/environment.js +13 -0
  37. package/esm/src/agent/testing/durable-run-canaries/index.d.ts +3 -0
  38. package/esm/src/agent/testing/durable-run-canaries/index.d.ts.map +1 -1
  39. package/esm/src/agent/testing/durable-run-canaries/index.js +3 -0
  40. package/esm/src/agent/testing/durable-run-canaries/validation.d.ts +7 -0
  41. package/esm/src/agent/testing/durable-run-canaries/validation.d.ts.map +1 -0
  42. package/esm/src/agent/testing/durable-run-canaries/validation.js +66 -0
  43. package/esm/src/agent/testing/index.d.ts +2 -2
  44. package/esm/src/agent/testing/index.d.ts.map +1 -1
  45. package/esm/src/agent/testing/index.js +2 -2
  46. package/esm/src/agent/testing/live-evals/cli-runner.d.ts +36 -0
  47. package/esm/src/agent/testing/live-evals/cli-runner.d.ts.map +1 -0
  48. package/esm/src/agent/testing/live-evals/cli-runner.js +143 -0
  49. package/esm/src/agent/testing/live-evals/environment.d.ts +12 -0
  50. package/esm/src/agent/testing/live-evals/environment.d.ts.map +1 -0
  51. package/esm/src/agent/testing/live-evals/environment.js +18 -0
  52. package/esm/src/agent/testing/live-evals/index.d.ts +3 -0
  53. package/esm/src/agent/testing/live-evals/index.d.ts.map +1 -1
  54. package/esm/src/agent/testing/live-evals/index.js +3 -0
  55. package/esm/src/agent/testing/live-evals/preflight.d.ts +9 -0
  56. package/esm/src/agent/testing/live-evals/preflight.d.ts.map +1 -0
  57. package/esm/src/agent/testing/live-evals/preflight.js +25 -0
  58. package/esm/src/extensions/builtin-extensions.d.ts.map +1 -1
  59. package/esm/src/extensions/builtin-extensions.js +4 -1
  60. package/esm/src/extensions/capabilities.d.ts +1 -1
  61. package/esm/src/extensions/capabilities.d.ts.map +1 -1
  62. package/esm/src/extensions/capabilities.js +1 -4
  63. package/esm/src/extensions/discovery.d.ts +2 -1
  64. package/esm/src/extensions/discovery.d.ts.map +1 -1
  65. package/esm/src/extensions/discovery.js +24 -1
  66. package/esm/src/extensions/index.d.ts +1 -1
  67. package/esm/src/extensions/index.d.ts.map +1 -1
  68. package/esm/src/extensions/loader.d.ts.map +1 -1
  69. package/esm/src/extensions/loader.js +26 -11
  70. package/esm/src/extensions/types.d.ts +8 -0
  71. package/esm/src/extensions/types.d.ts.map +1 -1
  72. package/esm/src/extensions/validation.d.ts.map +1 -1
  73. package/esm/src/extensions/validation.js +32 -8
  74. package/esm/src/utils/version-constant.d.ts +1 -1
  75. package/esm/src/utils/version-constant.js +1 -1
  76. package/package.json +1 -1
  77. package/src/cli/commands/extension/init-command.ts +14 -4
  78. package/src/deno.js +5 -4
  79. package/src/deps/esm.sh/@types/react-dom@19.2.3/client.d.ts +1 -1
  80. package/src/deps/esm.sh/react-dom@19.2.4/client.d.ts +1 -1
  81. package/src/extensions/ext-auth-jwt/src/index.ts +0 -1
  82. package/src/extensions/ext-bundler-esbuild/src/index.ts +4 -4
  83. package/src/extensions/ext-content-mdx/src/index.ts +4 -1
  84. package/src/extensions/ext-css-tailwind/src/index.ts +3 -1
  85. package/src/extensions/ext-db-sqlite/src/index.ts +3 -1
  86. package/src/extensions/ext-document-kreuzberg/src/index.ts +3 -1
  87. package/src/extensions/ext-llm-anthropic/src/index.ts +5 -1
  88. package/src/extensions/ext-llm-google/src/index.ts +5 -1
  89. package/src/extensions/ext-llm-openai/src/index.ts +5 -1
  90. package/src/extensions/ext-observability-opentelemetry/src/index.ts +3 -2
  91. package/src/extensions/ext-parser-babel/src/index.ts +4 -1
  92. package/src/extensions/ext-sandbox-shell-tools/src/index.ts +4 -1
  93. package/src/extensions/ext-schema-zod/src/index.ts +4 -1
  94. package/src/src/agent/testing/durable-run-canaries/cli-runner.ts +117 -0
  95. package/src/src/agent/testing/durable-run-canaries/environment.ts +27 -0
  96. package/src/src/agent/testing/durable-run-canaries/index.ts +18 -0
  97. package/src/src/agent/testing/durable-run-canaries/validation.ts +87 -0
  98. package/src/src/agent/testing/index.ts +14 -0
  99. package/src/src/agent/testing/live-evals/cli-runner.ts +234 -0
  100. package/src/src/agent/testing/live-evals/environment.ts +31 -0
  101. package/src/src/agent/testing/live-evals/index.ts +16 -0
  102. package/src/src/agent/testing/live-evals/preflight.ts +42 -0
  103. package/src/src/extensions/builtin-extensions.ts +4 -1
  104. package/src/src/extensions/capabilities.ts +1 -5
  105. package/src/src/extensions/discovery.ts +27 -2
  106. package/src/src/extensions/index.ts +1 -0
  107. package/src/src/extensions/loader.ts +29 -11
  108. package/src/src/extensions/types.ts +10 -0
  109. package/src/src/extensions/validation.ts +47 -7
  110. package/src/src/utils/version-constant.ts +1 -1
  111. package/src/deps/esm.sh/@types/react@19.2.3/global.d.ts +0 -165
  112. package/src/deps/esm.sh/@types/react@19.2.3/index.d.ts +0 -4301
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/testing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,4BAA4B,CAAC;AAGpC,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,kCAAkC,EACvC,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,oCAAoC,EACzC,KAAK,6BAA6B,EAClC,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,2BAA2B,EAC3B,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,8BAA8B,EAC9B,0BAA0B,EAC1B,0BAA0B,EAC1B,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,kCAAkC,EAClC,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,gCAAgC,EAChC,8CAA8C,EAC9C,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,6BAA6B,EAC7B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,iCAAiC,EACtC,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,qBAAqB,EAC1B,+BAA+B,EAC/B,KAAK,yBAAyB,EAC9B,mBAAmB,EACnB,2BAA2B,EAC3B,+BAA+B,EAC/B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/testing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,4BAA4B,CAAC;AAGpC,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,IAAI,+BAA+B,EAClD,oCAAoC,EACpC,oBAAoB,EACpB,+BAA+B,EAC/B,4BAA4B,EAC5B,qCAAqC,EACrC,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,kCAAkC,EACvC,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EACjC,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,oCAAoC,EACzC,KAAK,6BAA6B,EAClC,oBAAoB,EACpB,gCAAgC,EAChC,+BAA+B,EAC/B,kCAAkC,EAClC,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,2BAA2B,EAC3B,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,8BAA8B,EAC9B,0BAA0B,EAC1B,0BAA0B,EAC1B,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,kCAAkC,EAClC,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,EAC1B,8CAA8C,EAC9C,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,6BAA6B,EAC7B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,iCAAiC,EACtC,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,qBAAqB,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,+BAA+B,EAC/B,KAAK,gCAAgC,EACrC,KAAK,yBAAyB,EAC9B,mBAAmB,EACnB,2BAA2B,EAC3B,+BAA+B,EAC/B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
@@ -5,5 +5,5 @@
5
5
  */
6
6
  import "../../../_dnt.polyfills.js";
7
7
  export { assertCompleted, assertContains, assertToolCalled, printTestResults, testAgent, } from "./agent-tester.js";
8
- export { createDurableRunCanaryApiClient, createDurableRunCanaryRunner, durableRunCanaryRunnerInternals, getDurableRunCanaryMessageSchema, parseDurableRunCanaryRunSummary, } from "./durable-run-canaries/index.js";
9
- export { buildFailureSuffix, buildLiveEvalCaseMetadata, buildLiveEvalCaseTagSummary, buildLiveEvalRequestBody, buildLiveEvalRuntimeSummary, buildLiveEvalStatusSummary, buildProgressLine, buildRuntimePerformanceSummary, cancelLiveEvalInputRequest, containsOrderedSubsequence, containsSkillLoad, countStepStartedEvents, createFailedEvalResult, createLiveEvalApiClient, createLiveEvalCaseSupport, createLiveEvalConversation, createLiveEvalProjectUploadFixture, createLiveEvalRelease, createPassedEvalResult, createPlainTextPdf, createSkippedEvalResult, DEFAULT_LIVE_EVAL_AREA_TAG_RULES, DEFAULT_LIVE_EVAL_OPTIONAL_JUDGE_CASE_PREFIXES, deleteLiveEvalConversation, deleteLiveEvalProjectFile, getLiveEvalProjectFile, hasEveryLiveEvalTag, hasFinished, listOpenLiveEvalInputRequests, liveEvalRunnerInternals, resolveLiveEvalRequestedCaseIds, selectLiveEvalCases, submitLiveEvalInputResponse, waitForOpenLiveEvalInputRequest, withLiveEvalMetadata, } from "./live-evals/index.js";
8
+ export { assertCompleted as assertDurableRunCanaryCompleted, assertNoMalformedCreateFileToolCalls, collectAssistantText, createDurableRunCanaryApiClient, createDurableRunCanaryRunner, DEFAULT_DURABLE_RUN_CANARY_TIMEOUT_MS, durableRunCanaryRunnerInternals, findAssistantMessage, getDurableRunCanaryMessageSchema, parseDurableRunCanaryRunSummary, resolveDurableRunCanaryEnvironment, stringifyUnknown, } from "./durable-run-canaries/index.js";
9
+ export { buildFailureSuffix, buildLiveEvalCaseMetadata, buildLiveEvalCaseTagSummary, buildLiveEvalRequestBody, buildLiveEvalRuntimeSummary, buildLiveEvalStatusSummary, buildProgressLine, buildRuntimePerformanceSummary, cancelLiveEvalInputRequest, containsOrderedSubsequence, containsSkillLoad, countStepStartedEvents, createFailedEvalResult, createLiveEvalApiClient, createLiveEvalCaseSupport, createLiveEvalConversation, createLiveEvalProjectUploadFixture, createLiveEvalRelease, createPassedEvalResult, createPlainTextPdf, createSkippedEvalResult, DEFAULT_LIVE_EVAL_AREA_TAG_RULES, DEFAULT_LIVE_EVAL_ENDPOINT, DEFAULT_LIVE_EVAL_OPTIONAL_JUDGE_CASE_PREFIXES, deleteLiveEvalConversation, deleteLiveEvalProjectFile, evaluateRuntimeConfidenceEnv, getLiveEvalProjectFile, hasEveryLiveEvalTag, hasFinished, listOpenLiveEvalInputRequests, liveEvalRunnerInternals, printRuntimeConfidencePreflight, resolveLiveEvalEnvironment, resolveLiveEvalRequestedCaseIds, selectLiveEvalCases, submitLiveEvalInputResponse, waitForOpenLiveEvalInputRequest, withLiveEvalMetadata, } from "./live-evals/index.js";
@@ -0,0 +1,36 @@
1
+ import { type LiveEvalRuntime } from "./performance.js";
2
+ import { containsSkillLoad, countStepStartedEvents, createLiveEvalCaseSupport, hasFinished, type LiveEvalCase, type LiveEvalRunnerConfig } from "./runner.js";
3
+ type EnvRecord = Record<string, string | undefined>;
4
+ export interface LiveEvalCliCaseGroups {
5
+ readOnlyCases: LiveEvalCase[];
6
+ writeCases: LiveEvalCase[];
7
+ experimentalWriteCases: LiveEvalCase[];
8
+ }
9
+ export interface LiveEvalCliCaseFactoryInput {
10
+ authToken: string;
11
+ endpoint: string;
12
+ projectId: string | null;
13
+ branchId: string | null;
14
+ model: string | null;
15
+ requestTimeoutMs: number;
16
+ enableLlmJudge: boolean;
17
+ hasFinished: typeof hasFinished;
18
+ containsSkillLoad: typeof containsSkillLoad;
19
+ countStepStartedEvents: typeof countStepStartedEvents;
20
+ verifyFileExists: ReturnType<typeof createLiveEvalCaseSupport>["verifyFileExists"];
21
+ withJudge: ReturnType<typeof createLiveEvalCaseSupport>["withJudge"];
22
+ judgeLlm: ReturnType<typeof createLiveEvalCaseSupport>["judgeLlm"];
23
+ }
24
+ export interface RunLiveEvalCliInput {
25
+ env: EnvRecord;
26
+ caseSets: Record<string, readonly string[]>;
27
+ createCases: (input: LiveEvalCliCaseFactoryInput) => LiveEvalCliCaseGroups;
28
+ runtimes?: readonly LiveEvalRuntime[];
29
+ cwd?: string;
30
+ log?: (message: string) => void;
31
+ error?: (message: string) => void;
32
+ createCaseSupport?: (config: LiveEvalRunnerConfig) => ReturnType<typeof createLiveEvalCaseSupport>;
33
+ }
34
+ export declare function runLiveEvalCli(input: RunLiveEvalCliInput): Promise<number>;
35
+ export {};
36
+ //# sourceMappingURL=cli-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/cli-runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxF,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAC;AAKrB,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,sBAAsB,EAAE,YAAY,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,gBAAgB,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACnF,SAAS,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,WAAW,CAAC,CAAC;IACrE,QAAQ,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,UAAU,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,qBAAqB,CAAC;IAC3E,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAClB,MAAM,EAAE,oBAAoB,KACzB,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;CACnD;AAuBD,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwJhF"}
@@ -0,0 +1,143 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { cwd as getProcessCwd } from "node:process";
4
+ import { buildRuntimePerformanceSummary } from "./performance.js";
5
+ import { buildLiveEvalCaseTagSummary, buildLiveEvalRuntimeSummary, buildLiveEvalStatusSummary, resolveLiveEvalRequestedCaseIds, selectLiveEvalCases, } from "./report.js";
6
+ import { containsSkillLoad, countStepStartedEvents, createLiveEvalCaseSupport, hasFinished, } from "./runner.js";
7
+ import { getLiveEvalProjectFile } from "./api-client.js";
8
+ import { resolveLiveEvalEnvironment } from "./environment.js";
9
+ function splitCsvEnv(value) {
10
+ return new Set((value ?? "")
11
+ .split(",")
12
+ .map((entry) => entry.trim())
13
+ .filter((entry) => entry.length > 0));
14
+ }
15
+ function createTimestampedReportPath(input) {
16
+ return resolve(input.cwd, ".omx/logs", input.directory, `${new Date().toISOString().replaceAll(":", "-").replaceAll(".", "-")}.json`);
17
+ }
18
+ export async function runLiveEvalCli(input) {
19
+ const log = input.log ?? console.log;
20
+ const error = input.error ?? console.error;
21
+ const cwd = input.cwd ?? getProcessCwd();
22
+ const { endpoint, authToken, apiUrl, projectId, branchId, model } = resolveLiveEvalEnvironment(input.env);
23
+ const requestedRuntimeSelection = input.runtimes ?? ["framework"];
24
+ const runWriteEvals = input.env.AG_UI_EVAL_WRITE === "1";
25
+ const runExperimentalWriteEvals = input.env.AG_UI_EVAL_EXPERIMENTAL === "1";
26
+ const requestTimeoutMs = Number(input.env.AG_UI_EVAL_TIMEOUT_MS ?? "240000");
27
+ const progressLogIntervalMs = Number(input.env.AG_UI_EVAL_PROGRESS_MS ?? "15000");
28
+ const reportPath = input.env.AG_UI_EVAL_REPORT_PATH ??
29
+ createTimestampedReportPath({ cwd, directory: "ag-ui-live-evals" });
30
+ const requestedCaseIds = splitCsvEnv(input.env.AG_UI_EVAL_CASES);
31
+ const requestedCaseTags = splitCsvEnv(input.env.AG_UI_EVAL_TAGS);
32
+ const requestedCaseSetId = input.env.AG_UI_EVAL_CASE_SET?.trim() || null;
33
+ const enableLlmJudge = input.env.AG_UI_EVAL_LLM_JUDGE === "1";
34
+ const apiContext = {
35
+ apiUrl,
36
+ authToken,
37
+ projectId: projectId ?? null,
38
+ };
39
+ const createCaseSupport = input.createCaseSupport ?? createLiveEvalCaseSupport;
40
+ const { judgeLlm, runEval, verifyFileExists, withJudge } = createCaseSupport({
41
+ endpoint,
42
+ authToken,
43
+ apiUrl,
44
+ projectId: projectId ?? null,
45
+ branchId: branchId ?? null,
46
+ model: model ?? null,
47
+ requestTimeoutMs,
48
+ progressLogIntervalMs,
49
+ enableLlmJudge,
50
+ readProjectFile: (readerInput) => getLiveEvalProjectFile(apiContext, readerInput),
51
+ });
52
+ const { readOnlyCases, writeCases, experimentalWriteCases } = input.createCases({
53
+ authToken,
54
+ endpoint,
55
+ projectId: projectId ?? null,
56
+ branchId: branchId ?? null,
57
+ model: model ?? null,
58
+ requestTimeoutMs,
59
+ enableLlmJudge,
60
+ hasFinished,
61
+ containsSkillLoad,
62
+ countStepStartedEvents,
63
+ verifyFileExists,
64
+ withJudge,
65
+ judgeLlm,
66
+ });
67
+ if (authToken.length === 0) {
68
+ error("Missing VERYFRONT_TOKEN");
69
+ return 1;
70
+ }
71
+ log(`AG-UI live evals -> ${endpoint}`);
72
+ log(`Veryfront API -> ${apiUrl}`);
73
+ log(`Project scope -> ${projectId ?? "none"}`);
74
+ log(`Runtime -> ${requestedRuntimeSelection.join(", ")}`);
75
+ log(`Write evals -> ${runWriteEvals ? "enabled" : "disabled"}`);
76
+ log(`Experimental evals -> ${runExperimentalWriteEvals ? "enabled" : "disabled"}`);
77
+ log(`Case set -> ${requestedCaseSetId ?? "none"}`);
78
+ log(`Case tags -> ${requestedCaseTags.size > 0 ? [...requestedCaseTags].join(", ") : "none"}`);
79
+ const allCases = [...readOnlyCases, ...writeCases, ...experimentalWriteCases];
80
+ const resolvedRequestedCaseIds = resolveLiveEvalRequestedCaseIds({
81
+ caseSets: input.caseSets,
82
+ requestedCaseIds,
83
+ requestedCaseSetId,
84
+ });
85
+ const cases = selectLiveEvalCases({
86
+ allCases,
87
+ readOnlyCases,
88
+ writeCases,
89
+ experimentalWriteCases,
90
+ requestedCaseIds: resolvedRequestedCaseIds,
91
+ requestedCaseTags,
92
+ runWriteEvals,
93
+ runExperimentalWriteEvals,
94
+ });
95
+ const selectedCaseTagSummary = buildLiveEvalCaseTagSummary(cases);
96
+ if (cases.length === 0) {
97
+ error("No eval cases selected.");
98
+ return 1;
99
+ }
100
+ const results = [];
101
+ for (const runtime of requestedRuntimeSelection) {
102
+ log(`\n[runtime] ${runtime}`);
103
+ for (const testCase of cases) {
104
+ log(`\n[run] ${runtime} :: ${testCase.label}`);
105
+ const result = await runEval(testCase, runtime);
106
+ results.push(result);
107
+ log(`[${runtime}] [${result.status}] ${result.details}`);
108
+ }
109
+ }
110
+ const summary = buildLiveEvalStatusSummary(results);
111
+ const runtimeSummary = buildLiveEvalRuntimeSummary(requestedRuntimeSelection, results);
112
+ const runtimePerformanceSummary = buildRuntimePerformanceSummary(results);
113
+ log("\nSummary");
114
+ log(`passed: ${summary.passed}`);
115
+ log(`failed: ${summary.failed}`);
116
+ log(`skipped: ${summary.skipped}`);
117
+ for (const runtime of requestedRuntimeSelection) {
118
+ const currentRuntimeSummary = runtimeSummary[runtime];
119
+ log(`${runtime}: passed=${currentRuntimeSummary.passed} failed=${currentRuntimeSummary.failed} skipped=${currentRuntimeSummary.skipped}`);
120
+ const performance = runtimePerformanceSummary[runtime];
121
+ log(`${runtime}: avg=${performance.avgDurationMs}ms p50=${performance.p50DurationMs}ms p95=${performance.p95DurationMs}ms min=${performance.minDurationMs}ms max=${performance.maxDurationMs}ms`);
122
+ }
123
+ await mkdir(dirname(reportPath), { recursive: true });
124
+ await writeFile(reportPath, JSON.stringify({
125
+ generatedAt: new Date().toISOString(),
126
+ endpoint,
127
+ apiUrl,
128
+ projectId: projectId ?? null,
129
+ runtimes: requestedRuntimeSelection,
130
+ writeEvals: runWriteEvals,
131
+ requestedCaseIds: [...resolvedRequestedCaseIds],
132
+ requestedCaseTags: [...requestedCaseTags],
133
+ requestedCaseSetId,
134
+ caseMetadata: Object.fromEntries(cases.map((testCase) => [testCase.id, testCase.metadata ?? { tags: [] }])),
135
+ selectedCaseTagSummary,
136
+ results,
137
+ summary,
138
+ runtimeSummary,
139
+ runtimePerformanceSummary,
140
+ }, null, 2));
141
+ log(`report: ${reportPath}`);
142
+ return summary.failed > 0 ? 1 : 0;
143
+ }
@@ -0,0 +1,12 @@
1
+ import { type AgentServiceConfigInput } from "../../service/config.js";
2
+ export interface LiveEvalEnvironment {
3
+ endpoint: string;
4
+ authToken: string;
5
+ apiUrl: string;
6
+ projectId: string | undefined;
7
+ branchId: string | undefined;
8
+ model: string | undefined;
9
+ }
10
+ export declare const DEFAULT_LIVE_EVAL_ENDPOINT = "http://127.0.0.1:3001/api/ag-ui";
11
+ export declare function resolveLiveEvalEnvironment(env?: AgentServiceConfigInput): LiveEvalEnvironment;
12
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAA2B,MAAM,yBAAyB,CAAC;AAEhG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,0BAA0B,oCAAoC,CAAC;AAE5E,wBAAgB,0BAA0B,CACxC,GAAG,GAAE,uBAA4B,GAChC,mBAAmB,CAerB"}
@@ -0,0 +1,18 @@
1
+ import { parseAgentServiceConfig } from "../../service/config.js";
2
+ export const DEFAULT_LIVE_EVAL_ENDPOINT = "http://127.0.0.1:3001/api/ag-ui";
3
+ export function resolveLiveEvalEnvironment(env = {}) {
4
+ return {
5
+ endpoint: typeof env.AG_UI_EVAL_ENDPOINT === "string"
6
+ ? env.AG_UI_EVAL_ENDPOINT
7
+ : DEFAULT_LIVE_EVAL_ENDPOINT,
8
+ authToken: typeof env.VERYFRONT_TOKEN === "string" ? env.VERYFRONT_TOKEN : "",
9
+ apiUrl: typeof env.VERYFRONT_API_URL === "string"
10
+ ? env.VERYFRONT_API_URL
11
+ : parseAgentServiceConfig(env).VERYFRONT_API_URL,
12
+ projectId: typeof env.AG_UI_EVAL_PROJECT_ID === "string"
13
+ ? env.AG_UI_EVAL_PROJECT_ID
14
+ : undefined,
15
+ branchId: typeof env.AG_UI_EVAL_BRANCH_ID === "string" ? env.AG_UI_EVAL_BRANCH_ID : undefined,
16
+ model: typeof env.AG_UI_EVAL_MODEL === "string" ? env.AG_UI_EVAL_MODEL : undefined,
17
+ };
18
+ }
@@ -1,5 +1,8 @@
1
+ export { type LiveEvalCliCaseFactoryInput, type LiveEvalCliCaseGroups, runLiveEvalCli, type RunLiveEvalCliInput, } from "./cli-runner.js";
2
+ export { DEFAULT_LIVE_EVAL_ENDPOINT, type LiveEvalEnvironment, resolveLiveEvalEnvironment, } from "./environment.js";
1
3
  export { cancelLiveEvalInputRequest, createLiveEvalApiClient, createLiveEvalConversation, createLiveEvalProjectUploadFixture, createLiveEvalRelease, deleteLiveEvalConversation, deleteLiveEvalProjectFile, getLiveEvalProjectFile, listOpenLiveEvalInputRequests, type LiveEvalApiClient, type LiveEvalApiContext, type LiveEvalConversationInput, type LiveEvalCreateConversationInput, type LiveEvalCreateReleaseInput, type LiveEvalInputRequestInput, type LiveEvalInputRequestRecord, type LiveEvalInputResponseValues, type LiveEvalProjectFileInput, type LiveEvalProjectUploadFixtureInput, type LiveEvalRequestTimeoutInput, type LiveEvalSubmitInputResponseInput, type LiveEvalWaitForOpenInputRequestInput, submitLiveEvalInputResponse, waitForOpenLiveEvalInputRequest, } from "./api-client.js";
2
4
  export { buildFailureSuffix, buildProgressLine, containsOrderedSubsequence, createPlainTextPdf, } from "./formatting.js";
5
+ export { evaluateRuntimeConfidenceEnv, printRuntimeConfidencePreflight, type RuntimeConfidencePreflightResult, } from "./preflight.js";
3
6
  export { buildRuntimePerformanceSummary, type LiveEvalResultForPerformance, type LiveEvalRuntime, type RuntimePerformanceSummary, } from "./performance.js";
4
7
  export { buildLiveEvalCaseMetadata, type BuildLiveEvalCaseMetadataInput, DEFAULT_LIVE_EVAL_AREA_TAG_RULES, DEFAULT_LIVE_EVAL_OPTIONAL_JUDGE_CASE_PREFIXES, type LiveEvalCaseMetadataOptions, type LiveEvalCaseSurface, type LiveEvalCaseTagRule, withLiveEvalMetadata, } from "./metadata.js";
5
8
  export { buildLiveEvalRequestBody, type BuildLiveEvalRequestBodyInput, type LiveEvalRequestBody, } from "./request.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kCAAkC,EAClC,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,8BAA8B,EAC9B,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,gCAAgC,EAChC,8CAA8C,EAC9C,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kCAAkC,EAClC,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,KAAK,gCAAgC,GACtC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,8BAA8B,EAC9B,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,gCAAgC,EAChC,8CAA8C,EAC9C,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC"}
@@ -1,5 +1,8 @@
1
+ export { runLiveEvalCli, } from "./cli-runner.js";
2
+ export { DEFAULT_LIVE_EVAL_ENDPOINT, resolveLiveEvalEnvironment, } from "./environment.js";
1
3
  export { cancelLiveEvalInputRequest, createLiveEvalApiClient, createLiveEvalConversation, createLiveEvalProjectUploadFixture, createLiveEvalRelease, deleteLiveEvalConversation, deleteLiveEvalProjectFile, getLiveEvalProjectFile, listOpenLiveEvalInputRequests, submitLiveEvalInputResponse, waitForOpenLiveEvalInputRequest, } from "./api-client.js";
2
4
  export { buildFailureSuffix, buildProgressLine, containsOrderedSubsequence, createPlainTextPdf, } from "./formatting.js";
5
+ export { evaluateRuntimeConfidenceEnv, printRuntimeConfidencePreflight, } from "./preflight.js";
3
6
  export { buildRuntimePerformanceSummary, } from "./performance.js";
4
7
  export { buildLiveEvalCaseMetadata, DEFAULT_LIVE_EVAL_AREA_TAG_RULES, DEFAULT_LIVE_EVAL_OPTIONAL_JUDGE_CASE_PREFIXES, withLiveEvalMetadata, } from "./metadata.js";
5
8
  export { buildLiveEvalRequestBody, } from "./request.js";
@@ -0,0 +1,9 @@
1
+ import { type AgentServiceConfigInput } from "../../service/config.js";
2
+ export interface RuntimeConfidencePreflightResult {
3
+ ok: boolean;
4
+ resolvedApiUrl: string;
5
+ messages: string[];
6
+ }
7
+ export declare function evaluateRuntimeConfidenceEnv(env?: AgentServiceConfigInput, resolvedApiUrl?: string): RuntimeConfidencePreflightResult;
8
+ export declare function printRuntimeConfidencePreflight(result: RuntimeConfidencePreflightResult, output?: Pick<Console, "error" | "log">): void;
9
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAA2B,MAAM,yBAAyB,CAAC;AAEhG,MAAM,WAAW,gCAAgC;IAC/C,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,uBAA4B,EACjC,cAAc,GAAE,MAAuD,GACtE,gCAAgC,CAoBlC;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,gCAAgC,EACxC,MAAM,GAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAW,GAC/C,IAAI,CAKN"}
@@ -0,0 +1,25 @@
1
+ import { parseAgentServiceConfig } from "../../service/config.js";
2
+ export function evaluateRuntimeConfidenceEnv(env = {}, resolvedApiUrl = parseAgentServiceConfig(env).VERYFRONT_API_URL) {
3
+ const messages = [`Resolved VERYFRONT_API_URL: ${resolvedApiUrl}`];
4
+ let hasBlockers = false;
5
+ if (typeof env.VERYFRONT_TOKEN !== "string" || env.VERYFRONT_TOKEN.length === 0) {
6
+ hasBlockers = true;
7
+ messages.push("BLOCKER: VERYFRONT_TOKEN is missing");
8
+ }
9
+ if (typeof env.AG_UI_EVAL_PROJECT_ID !== "string" || env.AG_UI_EVAL_PROJECT_ID.length === 0) {
10
+ hasBlockers = true;
11
+ messages.push("BLOCKER: AG_UI_EVAL_PROJECT_ID is missing");
12
+ }
13
+ if (!hasBlockers) {
14
+ messages.push("Runtime-confidence preflight: PASS");
15
+ return { ok: true, resolvedApiUrl, messages };
16
+ }
17
+ messages.push("Runtime-confidence preflight: FAIL");
18
+ return { ok: false, resolvedApiUrl, messages };
19
+ }
20
+ export function printRuntimeConfidencePreflight(result, output = console) {
21
+ for (const message of result.messages) {
22
+ const writer = result.ok ? output.log : output.error;
23
+ writer(message);
24
+ }
25
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-extensions.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/builtin-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA0DvE,wBAAgB,yBAAyB,IAAI,mBAAmB,CAM/D;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAInD;AAiCD,wBAAgB,uBAAuB,IAAI,iBAAiB,EAAE,CAoD7D"}
1
+ {"version":3,"file":"builtin-extensions.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/builtin-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA0DvE,wBAAgB,yBAAyB,IAAI,mBAAmB,CAM/D;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAInD;AAoCD,wBAAgB,uBAAuB,IAAI,iBAAiB,EAAE,CAoD7D"}
@@ -65,7 +65,10 @@ function createBuiltinLLMProviderExtension(definition) {
65
65
  extension: {
66
66
  name: definition.extensionName,
67
67
  version: "0.1.0",
68
- capabilities: [{ type: "contract", name: `LLMProvider:${provider.id}` }],
68
+ contracts: {
69
+ requires: [LLMProviderRegistryName],
70
+ },
71
+ capabilities: [],
69
72
  setup(ctx) {
70
73
  const registry = ctx.require(LLMProviderRegistryName);
71
74
  didRegister = registerBuiltinLLMProvider(registry, provider);
@@ -10,7 +10,7 @@ import type { Capability, ExtensionLogger } from "./types.js";
10
10
  export declare function formatCapabilities(capabilities: Capability[]): string[];
11
11
  /**
12
12
  * Map capabilities to Deno CLI permission flags.
13
- * Skips non-system capabilities (e.g., "contract").
13
+ * Skips capabilities without a Deno permission mapping.
14
14
  */
15
15
  export declare function mapToDenoPermissions(capabilities: Capability[]): string[];
16
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/capabilities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAevE;AA2BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAyBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,UAAU,EAAE,EAC1B,MAAM,EAAE,eAAe,GACtB,IAAI,CAKN"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/capabilities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAWvE;AA2BD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAyBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,UAAU,EAAE,EAC1B,MAAM,EAAE,eAAe,GACtB,IAAI,CAKN"}
@@ -8,9 +8,6 @@
8
8
  */
9
9
  export function formatCapabilities(capabilities) {
10
10
  return capabilities.map((cap) => {
11
- if (cap.type === "contract") {
12
- return `contract: ${cap.name}`;
13
- }
14
11
  const { type, ...rest } = cap;
15
12
  const extras = Object.keys(rest);
16
13
  if (extras.length === 0)
@@ -41,7 +38,7 @@ const DENO_PERMISSION_MAP = {
41
38
  };
42
39
  /**
43
40
  * Map capabilities to Deno CLI permission flags.
44
- * Skips non-system capabilities (e.g., "contract").
41
+ * Skips capabilities without a Deno permission mapping.
45
42
  */
46
43
  export function mapToDenoPermissions(capabilities) {
47
44
  const seen = new Set();
@@ -1,4 +1,4 @@
1
- import type { Capability, ResolvedExtension } from "./types.js";
1
+ import type { Capability, PackageContractMetadata, ResolvedExtension } from "./types.js";
2
2
  /**
3
3
  * Metadata extracted from a package.json that declares itself
4
4
  * as a veryfront extension.
@@ -6,6 +6,7 @@ import type { Capability, ResolvedExtension } from "./types.js";
6
6
  export interface PackageMetadata {
7
7
  isExtension: true;
8
8
  capabilities: Capability[];
9
+ contracts?: PackageContractMetadata;
9
10
  }
10
11
  /**
11
12
  * Parse veryfront extension metadata from a package.json-like object.
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/discovery.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,UAAU,EAAE,CAAC;CAC5B;AAUD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EAAE,EAC3B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC,EAC3D,OAAO,CAAC,EAAE,iBAAiB,EAAE,GAC5B,iBAAiB,EAAE,CA2BrB;AA6BD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC,CA4BpE;AAqBD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/discovery.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,uBAAuB,CAAC;CACrC;AA+BD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,eAAe,GAAG,SAAS,CAsB7B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,iBAAiB,EAAE,EAC3B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,EAAE,iBAAiB,EAAE,EAC5B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC,EAC3D,OAAO,CAAC,EAAE,iBAAiB,EAAE,GAC5B,iBAAiB,EAAE,CA2BrB;AA6BD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC,CAAC,CA4BpE;AAqBD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB"}
@@ -15,6 +15,26 @@ function isCapability(value) {
15
15
  const cap = value;
16
16
  return typeof cap.type === "string" && cap.type.length > 0;
17
17
  }
18
+ function parseStringList(value) {
19
+ if (!Array.isArray(value))
20
+ return undefined;
21
+ const entries = value.filter((entry) => typeof entry === "string" && entry.length > 0);
22
+ return entries.length > 0 ? entries : undefined;
23
+ }
24
+ function parseContractMetadata(value) {
25
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
26
+ return undefined;
27
+ }
28
+ const raw = value;
29
+ const contracts = {};
30
+ const provides = parseStringList(raw.provides);
31
+ const requires = parseStringList(raw.requires);
32
+ if (provides)
33
+ contracts.provides = provides;
34
+ if (requires)
35
+ contracts.requires = requires;
36
+ return provides || requires ? contracts : undefined;
37
+ }
18
38
  /**
19
39
  * Parse veryfront extension metadata from a package.json-like object.
20
40
  *
@@ -35,7 +55,10 @@ export function parsePackageMetadata(pkg) {
35
55
  const capabilities = Array.isArray(meta.capabilities)
36
56
  ? meta.capabilities.filter(isCapability)
37
57
  : [];
38
- return { isExtension: true, capabilities };
58
+ const contracts = parseContractMetadata(meta.contracts);
59
+ return contracts
60
+ ? { isExtension: true, capabilities, contracts }
61
+ : { isExtension: true, capabilities };
39
62
  }
40
63
  /**
41
64
  * Merge extensions from all four sources in priority order.
@@ -21,7 +21,7 @@
21
21
  * ```
22
22
  */
23
23
  import "../../_dnt.polyfills.js";
24
- export type { Capability, Extension, ExtensionConfigEntry, ExtensionContext, ExtensionFactory, ExtensionLogger, ExtensionSource, ResolvedExtension, } from "./types.js";
24
+ export type { Capability, Extension, ExtensionConfigEntry, ExtensionContext, ExtensionContractMetadata, ExtensionFactory, ExtensionLogger, ExtensionSource, ResolvedExtension, } from "./types.js";
25
25
  export { resolve, tryResolve } from "./contracts.js";
26
26
  export type { PackageMetadata } from "./discovery.js";
27
27
  export { discoverLocalExtensions, discoverPackageExtensions, discoverProjectExtensions, mergeExtensions, parsePackageMetadata, } from "./discovery.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,yBAAyB,CAAC;AAEjC,YAAY,EACV,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGrD,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,4BAA4B,EAC5B,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,yBAAyB,CAAC;AAEjC,YAAY,EACV,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGrD,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGrE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,4BAA4B,EAC5B,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAA+B,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElG,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAA+B;IAE7C;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;gBAI5C,MAAM,EAAE,eAAe;IAInC;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;IAIpE,OAAO,CAAC,mBAAmB;IA8B3B;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;IA6ErE;;;OAGG;IACG,QAAQ,CACZ,UAAU,EAAE,iBAAiB,EAAE,EAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC;IAgFhB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBnC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAA+B,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElG,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAA+B;IAE7C;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;gBAI5C,MAAM,EAAE,eAAe;IAInC;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;IAIpE,OAAO,CAAC,mBAAmB;IA8B3B;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;IAyErE;;;OAGG;IACG,QAAQ,CACZ,UAAU,EAAE,iBAAiB,EAAE,EAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC;IAuFhB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBnC"}
@@ -66,14 +66,10 @@ export class ExtensionLoader {
66
66
  for (const resolved of extensions) {
67
67
  const ext = resolved.extension;
68
68
  extByName.set(ext.name, resolved);
69
- if (ext.provides) {
70
- for (const contract of Object.keys(ext.provides)) {
71
- providerOf.set(contract, ext.name);
72
- }
69
+ for (const contract of providedContractNames(ext)) {
70
+ providerOf.set(contract, ext.name);
73
71
  }
74
- const contracts = ext.capabilities
75
- .filter((c) => c.type === "contract")
76
- .map((c) => c.name);
72
+ const contracts = requiredContractNames(ext);
77
73
  if (contracts.length > 0) {
78
74
  consumesContracts.set(ext.name, contracts);
79
75
  }
@@ -138,8 +134,9 @@ export class ExtensionLoader {
138
134
  for (const [name, impl] of Object.entries(this.primed)) {
139
135
  register(name, impl);
140
136
  }
137
+ const loadOrder = this.topologicalSort(this.flattenPresets(extensions));
141
138
  // Check for contract conflicts before loading
142
- const conflicts = detectConflicts(extensions);
139
+ const conflicts = detectConflicts(loadOrder);
143
140
  if (conflicts.length > 0) {
144
141
  const details = conflicts
145
142
  .map((c) => `"${c.contract}" provided by: ${c.providers.map((p) => p.name).join(", ")}`)
@@ -152,8 +149,8 @@ export class ExtensionLoader {
152
149
  // provider later in the iteration order cannot overwrite the winning impl
153
150
  // via register(). Without this, merged inputs (config -> package ->
154
151
  // project -> local-file) silently invert the documented source priority.
155
- const contractWinner = selectContractProviders(extensions);
156
- for (const resolved of extensions) {
152
+ const contractWinner = selectContractProviders(loadOrder);
153
+ for (const resolved of loadOrder) {
157
154
  const ext = resolved.extension;
158
155
  const issues = validateExtension(ext);
159
156
  if (issues.length > 0) {
@@ -173,7 +170,12 @@ export class ExtensionLoader {
173
170
  const ctx = {
174
171
  get: (contract) => tryResolve(contract),
175
172
  require: (contract) => resolveContract(contract),
176
- provide: (contract, impl) => register(contract, impl),
173
+ provide: (contract, impl) => {
174
+ const winner = contractWinner.get(contract);
175
+ if (!winner || winner === resolved) {
176
+ register(contract, impl);
177
+ }
178
+ },
177
179
  config: projectConfig,
178
180
  logger: this.logger,
179
181
  };
@@ -225,3 +227,16 @@ export class ExtensionLoader {
225
227
  reset();
226
228
  }
227
229
  }
230
+ function providedContractNames(ext) {
231
+ const names = new Set();
232
+ for (const contract of Object.keys(ext.provides ?? {})) {
233
+ names.add(contract);
234
+ }
235
+ for (const contract of ext.contracts?.provides ?? []) {
236
+ names.add(contract);
237
+ }
238
+ return [...names];
239
+ }
240
+ function requiredContractNames(ext) {
241
+ return ext.contracts?.requires ?? [];
242
+ }
@@ -11,6 +11,13 @@ export interface Capability {
11
11
  type: string;
12
12
  [key: string]: unknown;
13
13
  }
14
+ export interface ExtensionContractMetadata {
15
+ /** Contracts this extension registers dynamically during setup(). */
16
+ provides?: string[];
17
+ /** Contracts this extension needs before setup() runs. */
18
+ requires?: string[];
19
+ }
20
+ export type PackageContractMetadata = ExtensionContractMetadata;
14
21
  export interface ExtensionContext {
15
22
  get<T>(contract: string): T | undefined;
16
23
  require<T>(contract: string): T;
@@ -28,6 +35,7 @@ export interface Extension {
28
35
  name: string;
29
36
  version: string;
30
37
  capabilities: Capability[];
38
+ contracts?: ExtensionContractMetadata;
31
39
  setup?(ctx: ExtensionContext): Promise<void> | void;
32
40
  teardown?(): Promise<void> | void;
33
41
  provides?: Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,SAAS,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,SAAS,GACT,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,KAAK,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,SAAS,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,SAAS,GACT,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAa,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM3D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,iBAAiB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAgBhC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAmCxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE,CA2C/E"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAa,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM3D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,iBAAiB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAchC;AA0BD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAwDxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE,CAwC/E"}