@farming-labs/docs 0.2.120 → 0.2.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/access.d.mts +13 -0
- package/dist/access.mjs +56 -0
- package/dist/agent-conformance.d.mts +60 -0
- package/dist/agent-conformance.mjs +538 -0
- package/dist/agent-contract.d.mts +47 -0
- package/dist/agent-contract.mjs +645 -0
- package/dist/agent-detection.d.mts +6 -0
- package/dist/agent-detection.mjs +83 -0
- package/dist/agent-evals.d.mts +224 -0
- package/dist/{agent-evals-BLNLvXbG.mjs → agent-evals.mjs} +7 -565
- package/dist/agent-feedback-evaluations-node.mjs +38 -0
- package/dist/agent-feedback-evaluations.d.mts +91 -0
- package/dist/{agent-feedback-evaluations-CcMGlgsO.mjs → agent-feedback-evaluations.mjs} +2 -2
- package/dist/agent-feedback-loop.d.mts +45 -0
- package/dist/{agent-feedback-loop-CcZL_sb1.mjs → agent-feedback-loop.mjs} +1 -1
- package/dist/agent-maintenance.d.mts +71 -0
- package/dist/{agent-maintenance-CuZ7iAKq.mjs → agent-maintenance.mjs} +1 -1
- package/dist/agent-provenance.d.mts +23 -0
- package/dist/agent-provenance.mjs +77 -0
- package/dist/agent-scope.mjs +321 -0
- package/dist/agent-skills-archive.mjs +86 -0
- package/dist/agent-skills-bundle.d.mts +1 -1
- package/dist/{agent-skills-progressive-disclosure-PjPtTYL-.mjs → agent-skills-progressive-disclosure.mjs} +2 -2
- package/dist/{agent-skills-server-D5IuvwM7.d.mts → agent-skills-server.d.mts} +3 -3
- package/dist/{agent-skills-server-BC7md56k.mjs → agent-skills-server.mjs} +2 -2
- package/dist/agent-skills-vite.d.mts +3 -3
- package/dist/agent-skills-vite.mjs +1 -2
- package/dist/agent-surface-drift.mjs +236 -0
- package/dist/{golden-evaluations-CLUViycJ.mjs → agent-usefulness.mjs} +5 -290
- package/dist/{content-change-hydration-wqXIZHp6.d.mts → agent.d.mts} +10 -411
- package/dist/agent.mjs +2729 -0
- package/dist/{analytics-w3FDOksr.d.mts → analytics.d.mts} +2 -2
- package/dist/{analytics-p8Vhhu2P.mjs → analytics.mjs} +2 -2
- package/dist/{sitemap-server-BUdPBcGs.d.mts → api-reference.d.mts} +2 -6
- package/dist/api-reference.mjs +1481 -0
- package/dist/{audience-exposure-DBrFWULA.d.mts → audience-exposure.d.mts} +1 -1
- package/dist/audience-exposure.mjs +8 -0
- package/dist/audience.d.mts +44 -0
- package/dist/audience.mjs +1654 -0
- package/dist/authoring-mcp.d.mts +44 -0
- package/dist/{authoring-mcp-CiCUQe3o.mjs → authoring-mcp.mjs} +3 -3
- package/dist/browser.d.mts +6 -4
- package/dist/browser.mjs +6 -7
- package/dist/build.d.mts +8 -0
- package/dist/build.mjs +8 -0
- package/dist/changelog.d.mts +20 -0
- package/dist/changelog.mjs +39 -0
- package/dist/{agent-export-CA6IUQ7T.mjs → cli/agent-export.mjs} +19 -45
- package/dist/{agent-CYk2DxY7.mjs → cli/agent.mjs} +6 -35
- package/dist/{agents-BUiVmj8i.mjs → cli/agents.mjs} +5 -18
- package/dist/cli/api-doctor.mjs +206 -0
- package/dist/{authoring-C2ymvYWl.mjs → cli/authoring.mjs} +2 -8
- package/dist/{cloud-6eKrlmKd.mjs → cli/cloud.mjs} +3 -3
- package/dist/{codeblocks-CHpgAwY-.mjs → cli/codeblocks.mjs} +2 -2
- package/dist/cli/config.d.mts +11 -0
- package/dist/{config-BZnKAj_Y.mjs → cli/config.mjs} +1 -1
- package/dist/cli/dev-banner.mjs +58 -0
- package/dist/{dev-Bnn-NUNa.mjs → cli/dev.mjs} +3 -57
- package/dist/{doctor-Bfkrkzad.mjs → cli/doctor.mjs} +41 -226
- package/dist/{downgrade-CHMta85e.mjs → cli/downgrade.mjs} +2 -2
- package/dist/cli/errors.d.mts +4 -0
- package/dist/{errors-BtnVLhNF.mjs → cli/errors.mjs} +1 -1
- package/dist/{feedback-evals-DMilg9pY.mjs → cli/feedback-evals.mjs} +3 -36
- package/dist/{feedback-DL4T5oIO.mjs → cli/feedback.mjs} +1 -1
- package/dist/cli/git-dates.mjs +35 -0
- package/dist/cli/golden-evaluations.mjs +52 -0
- package/dist/cli/index.d.mts +2 -3
- package/dist/cli/index.mjs +38 -38
- package/dist/{init-K0LmXDZ5.mjs → cli/init.mjs} +3 -3
- package/dist/{mcp-iLCmnPJI.mjs → cli/mcp.mjs} +7 -19
- package/dist/{openapi-diff-HcpUNjA-.mjs → cli/openapi-diff.mjs} +2 -7
- package/dist/{openapi-sdk-BQKC6H-_.mjs → cli/openapi-sdk.mjs} +2 -7
- package/dist/{openapi-source-DK6ts_Bk.mjs → cli/openapi-source.mjs} +2 -2
- package/dist/{package-version-HJhYeq4M.mjs → cli/package-version.mjs} +2 -2
- package/dist/{propose-JmUv_BTt.mjs → cli/propose.mjs} +1 -1
- package/dist/{review-C6EmbV0l.mjs → cli/review.mjs} +16 -15
- package/dist/{robots-DteZB8vl.mjs → cli/robots.mjs} +3 -7
- package/dist/{search-Bhuv_YsL.mjs → cli/search.mjs} +7 -20
- package/dist/{sitemap-DW5LDKDa.mjs → cli/sitemap.mjs} +7 -42
- package/dist/{skills-BAPQLSCm.mjs → cli/skills.mjs} +5 -19
- package/dist/{templates-BuQ8YsGv.mjs → cli/templates.mjs} +1 -1
- package/dist/{upgrade-DlQMOFV1.mjs → cli/upgrade.mjs} +2 -2
- package/dist/{utils-C7KDrPpA.mjs → cli/utils.mjs} +1 -1
- package/dist/client/react.d.mts +2 -18
- package/dist/client/react.mjs +1 -157
- package/dist/{cloud-analytics-D14HplI7.mjs → cloud-analytics.mjs} +1 -1
- package/dist/{cloud-ask-ai-BrsTXQf6.d.mts → cloud-ask-ai.d.mts} +2 -2
- package/dist/{cloud-ask-ai-BqKhjpS5.mjs → cloud-ask-ai.mjs} +3 -3
- package/dist/code-blocks.d.mts +51 -0
- package/dist/{code-blocks-GYdvS3BH.mjs → code-blocks.mjs} +2 -2
- package/dist/code-group-mdx.d.mts +11 -0
- package/dist/code-group-mdx.mjs +57 -0
- package/dist/content-change-hydration.d.mts +87 -0
- package/dist/{openapi-mcp-BIOTLiA7.mjs → content-change-hydration.mjs} +5 -210
- package/dist/content-changes.d.mts +47 -0
- package/dist/content-changes.mjs +216 -0
- package/dist/create-theme.d.mts +48 -0
- package/dist/create-theme.mjs +57 -0
- package/dist/date.d.mts +5 -0
- package/dist/date.mjs +17 -0
- package/dist/define-docs.d.mts +9 -0
- package/dist/define-docs.mjs +46 -0
- package/dist/docs-cloud-client.d.mts +18 -0
- package/dist/docs-cloud-client.mjs +161 -0
- package/dist/docs-cloud-server.d.mts +2 -2
- package/dist/docs-cloud-server.mjs +2 -3
- package/dist/heading-toc.d.mts +10 -0
- package/dist/heading-toc.mjs +23 -0
- package/dist/http-body.d.mts +14 -0
- package/dist/{http-body-DkAPk6D5.mjs → http-body.mjs} +1 -1
- package/dist/http-cache.d.mts +25 -0
- package/dist/http-cache.mjs +140 -0
- package/dist/http-link.mjs +81 -0
- package/dist/i18n.d.mts +18 -0
- package/dist/{i18n-B1gJ9EW0.mjs → i18n.mjs} +1 -1
- package/dist/index.d.mts +42 -674
- package/dist/index.mjs +40 -14
- package/dist/markdown-rendering.mjs +1 -1
- package/dist/markdown-section-cache.mjs +49 -0
- package/dist/markdown-sections.d.mts +47 -0
- package/dist/{markdown-sections-9Oxr33b-.mjs → markdown-sections.mjs} +29 -703
- package/dist/mcp-auth.d.mts +14 -0
- package/dist/mcp-auth.mjs +99 -0
- package/dist/mcp.d.mts +5 -3
- package/dist/mcp.mjs +21 -9
- package/dist/mdx.d.mts +6 -0
- package/dist/mdx.mjs +7 -0
- package/dist/metadata.d.mts +60 -0
- package/dist/{metadata-BOHn0Y5K.mjs → metadata.mjs} +2 -2
- package/dist/native-api-reference.mjs +968 -0
- package/dist/okf.d.mts +42 -0
- package/dist/okf.mjs +145 -0
- package/dist/openapi-contract.mjs +154 -0
- package/dist/{openapi-mcp-node-C4jUpZG6.mjs → openapi-mcp-node.mjs} +1 -1
- package/dist/openapi-mcp.d.mts +26 -0
- package/dist/openapi-mcp.mjs +132 -0
- package/dist/openapi-operations.d.mts +71 -0
- package/dist/{openapi-operations-DFpaqOqA.mjs → openapi-operations.mjs} +1 -1
- package/dist/openapi-overlays.mjs +221 -0
- package/dist/openapi-references.mjs +233 -0
- package/dist/pagination.d.mts +7 -0
- package/dist/pagination.mjs +100 -0
- package/dist/prompt-references.d.mts +12 -0
- package/dist/prompt-references.mjs +132 -0
- package/dist/prompt-utils.d.mts +36 -0
- package/dist/{prompt-utils-B5g-bv7o.mjs → prompt-utils.mjs} +1 -57
- package/dist/reading-time.d.mts +23 -0
- package/dist/reading-time.mjs +58 -0
- package/dist/related.d.mts +7 -0
- package/dist/related.mjs +50 -0
- package/dist/retrieval-digest.d.mts +16 -0
- package/dist/{retrieval-digest-CT-eIEcp.mjs → retrieval-digest.mjs} +1 -1
- package/dist/review.d.mts +69 -0
- package/dist/review.mjs +562 -0
- package/dist/robots.d.mts +54 -0
- package/dist/{robots-BYJAVeI6.mjs → robots.mjs} +5 -3
- package/dist/runtime.d.mts +3 -3
- package/dist/runtime.mjs +3 -9
- package/dist/search.d.mts +210 -0
- package/dist/search.mjs +3401 -0
- package/dist/server.d.mts +22 -198
- package/dist/server.mjs +21 -19
- package/dist/sidebar.d.mts +15 -0
- package/dist/sidebar.mjs +73 -0
- package/dist/sitemap-server.d.mts +7 -0
- package/dist/{sitemap-server-Lg3YhUx4.mjs → sitemap-server.mjs} +2 -2
- package/dist/{sitemap-Cl8vrixd.d.mts → sitemap.d.mts} +3 -3
- package/dist/sitemap.mjs +254 -0
- package/dist/{standards-discovery-BHPc7YIX.d.mts → standards-discovery.d.mts} +2 -2
- package/dist/{standards-discovery-sSEojU80.mjs → standards-discovery.mjs} +3 -139
- package/dist/telemetry-runtime.d.mts +42 -0
- package/dist/telemetry-runtime.mjs +238 -0
- package/dist/telemetry.d.mts +15 -0
- package/dist/telemetry.mjs +117 -0
- package/dist/{types-BJFeMXWZ.d.mts → types.d.mts} +3 -2
- package/dist/urls.d.mts +7 -0
- package/dist/urls.mjs +21 -0
- package/dist/utils.d.mts +8 -0
- package/dist/utils.mjs +22 -0
- package/package.json +21 -3
- package/dist/agent-DkAidqtV.mjs +0 -9026
- package/dist/api-reference-BYee4zMo.mjs +0 -3046
- package/dist/prompt-references-DMgbu_dz.mjs +0 -1082
- package/dist/retrieval-digest-AOx2-LbC.d.mts +0 -367
- package/dist/sidebar-CFHBj29f.mjs +0 -421
- package/dist/sidebar-CMPbVfGP.d.mts +0 -63
- /package/dist/{openapi-CfCzX_a1.mjs → cli/openapi.mjs} +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { DocsAgentGoldenTask } from "./types.mjs";
|
|
2
|
+
import { DocsAgentFeedbackImprovementReport } from "./agent-feedback-loop.mjs";
|
|
3
|
+
import { DocsGoldenTasksReport } from "./agent-evals.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/agent-feedback-evaluations.d.ts
|
|
6
|
+
declare const DOCS_AGENT_FEEDBACK_EVALUATION_CANDIDATES_FORMAT: "farming-labs-agent-feedback-evaluation-candidates.v1";
|
|
7
|
+
declare const DOCS_AGENT_FEEDBACK_EVALUATION_BASELINE_FORMAT: "farming-labs-agent-feedback-evaluation-baseline.v1";
|
|
8
|
+
declare const DOCS_AGENT_FEEDBACK_EVALUATION_REGRESSION_FORMAT: "farming-labs-agent-feedback-evaluation-regression.v1";
|
|
9
|
+
interface DocsAgentFeedbackEvaluationCandidate {
|
|
10
|
+
id: string;
|
|
11
|
+
fingerprint: string;
|
|
12
|
+
state: "candidate";
|
|
13
|
+
task: DocsAgentGoldenTask;
|
|
14
|
+
evidence: {
|
|
15
|
+
clusterId: string;
|
|
16
|
+
page: string;
|
|
17
|
+
occurrences: number;
|
|
18
|
+
outcomes: string[];
|
|
19
|
+
};
|
|
20
|
+
sanitization: {
|
|
21
|
+
redactionCount: number;
|
|
22
|
+
};
|
|
23
|
+
promotion: {
|
|
24
|
+
target: "agent.evaluations.tasks";
|
|
25
|
+
requiresHumanReview: true;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
interface DocsAgentFeedbackEvaluationDuplicate {
|
|
29
|
+
clusterId: string;
|
|
30
|
+
taskId: string;
|
|
31
|
+
fingerprint: string;
|
|
32
|
+
reason: "existing-id" | "existing-fingerprint" | "duplicate-candidate";
|
|
33
|
+
}
|
|
34
|
+
interface DocsAgentFeedbackEvaluationCandidateRegistry {
|
|
35
|
+
format: typeof DOCS_AGENT_FEEDBACK_EVALUATION_CANDIDATES_FORMAT;
|
|
36
|
+
generatedAt: string;
|
|
37
|
+
sourceFeedbackCount: number;
|
|
38
|
+
sourceClusterCount: number;
|
|
39
|
+
candidateCount: number;
|
|
40
|
+
duplicateCount: number;
|
|
41
|
+
redactionCount: number;
|
|
42
|
+
candidates: DocsAgentFeedbackEvaluationCandidate[];
|
|
43
|
+
duplicates: DocsAgentFeedbackEvaluationDuplicate[];
|
|
44
|
+
promotion: {
|
|
45
|
+
mode: "review-required";
|
|
46
|
+
automaticallyUpdatesConfig: false;
|
|
47
|
+
automaticallyPublishes: false;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
interface BuildDocsAgentFeedbackEvaluationCandidatesOptions {
|
|
51
|
+
generatedAt?: string;
|
|
52
|
+
existingTasks?: readonly DocsAgentGoldenTask[];
|
|
53
|
+
}
|
|
54
|
+
interface DocsAgentFeedbackEvaluationTaskBaseline {
|
|
55
|
+
id: string;
|
|
56
|
+
passed: boolean;
|
|
57
|
+
score: number;
|
|
58
|
+
}
|
|
59
|
+
interface DocsAgentFeedbackEvaluationBaseline {
|
|
60
|
+
format: typeof DOCS_AGENT_FEEDBACK_EVALUATION_BASELINE_FORMAT;
|
|
61
|
+
generatedAt: string;
|
|
62
|
+
score: number;
|
|
63
|
+
taskCount: number;
|
|
64
|
+
passedTaskCount: number;
|
|
65
|
+
tasks: DocsAgentFeedbackEvaluationTaskBaseline[];
|
|
66
|
+
}
|
|
67
|
+
interface DocsAgentFeedbackEvaluationRegression {
|
|
68
|
+
kind: "missing-task" | "new-failure" | "pass-to-fail" | "score-drop" | "suite-score-drop";
|
|
69
|
+
taskId?: string;
|
|
70
|
+
message: string;
|
|
71
|
+
}
|
|
72
|
+
interface DocsAgentFeedbackEvaluationRegressionReport {
|
|
73
|
+
format: typeof DOCS_AGENT_FEEDBACK_EVALUATION_REGRESSION_FORMAT;
|
|
74
|
+
passed: boolean;
|
|
75
|
+
baselineScore: number;
|
|
76
|
+
currentScore: number;
|
|
77
|
+
scoreDelta: number;
|
|
78
|
+
maxScoreDrop: number;
|
|
79
|
+
regressions: DocsAgentFeedbackEvaluationRegression[];
|
|
80
|
+
}
|
|
81
|
+
interface CompareDocsAgentFeedbackEvaluationOptions {
|
|
82
|
+
/** Maximum allowed score decrease for the suite and each task. @default 0 */
|
|
83
|
+
maxScoreDrop?: number;
|
|
84
|
+
/** Treat newly added failing tasks as regressions. @default true */
|
|
85
|
+
failOnNewFailures?: boolean;
|
|
86
|
+
}
|
|
87
|
+
declare function buildDocsAgentFeedbackEvaluationCandidates(report: DocsAgentFeedbackImprovementReport, options?: BuildDocsAgentFeedbackEvaluationCandidatesOptions): DocsAgentFeedbackEvaluationCandidateRegistry;
|
|
88
|
+
declare function createDocsAgentFeedbackEvaluationBaseline(report: DocsGoldenTasksReport, generatedAt?: string): DocsAgentFeedbackEvaluationBaseline;
|
|
89
|
+
declare function compareDocsAgentFeedbackEvaluationBaseline(current: DocsGoldenTasksReport, baseline: DocsAgentFeedbackEvaluationBaseline, options?: CompareDocsAgentFeedbackEvaluationOptions): DocsAgentFeedbackEvaluationRegressionReport;
|
|
90
|
+
//#endregion
|
|
91
|
+
export { BuildDocsAgentFeedbackEvaluationCandidatesOptions, CompareDocsAgentFeedbackEvaluationOptions, DOCS_AGENT_FEEDBACK_EVALUATION_BASELINE_FORMAT, DOCS_AGENT_FEEDBACK_EVALUATION_CANDIDATES_FORMAT, DOCS_AGENT_FEEDBACK_EVALUATION_REGRESSION_FORMAT, DocsAgentFeedbackEvaluationBaseline, DocsAgentFeedbackEvaluationCandidate, DocsAgentFeedbackEvaluationCandidateRegistry, DocsAgentFeedbackEvaluationDuplicate, DocsAgentFeedbackEvaluationRegression, DocsAgentFeedbackEvaluationRegressionReport, DocsAgentFeedbackEvaluationTaskBaseline, buildDocsAgentFeedbackEvaluationCandidates, compareDocsAgentFeedbackEvaluationBaseline, createDocsAgentFeedbackEvaluationBaseline };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sha256DocsContent } from "./retrieval-digest.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/agent-feedback-evaluations.ts
|
|
4
4
|
const DOCS_AGENT_FEEDBACK_EVALUATION_CANDIDATES_FORMAT = "farming-labs-agent-feedback-evaluation-candidates.v1";
|
|
@@ -237,4 +237,4 @@ function compareDocsAgentFeedbackEvaluationBaseline(current, baseline, options =
|
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
//#endregion
|
|
240
|
-
export {
|
|
240
|
+
export { DOCS_AGENT_FEEDBACK_EVALUATION_BASELINE_FORMAT, DOCS_AGENT_FEEDBACK_EVALUATION_CANDIDATES_FORMAT, DOCS_AGENT_FEEDBACK_EVALUATION_REGRESSION_FORMAT, buildDocsAgentFeedbackEvaluationCandidates, compareDocsAgentFeedbackEvaluationBaseline, createDocsAgentFeedbackEvaluationBaseline };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { DocsAgentFeedbackData, DocsAgentGoldenTask } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/agent-feedback-loop.d.ts
|
|
4
|
+
declare const DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT: "farming-labs-agent-feedback-improvements.v1";
|
|
5
|
+
interface DocsAgentFeedbackImprovementOptions {
|
|
6
|
+
/** Minimum failed reports required before a cluster becomes recurring. @default 2 */
|
|
7
|
+
minOccurrences?: number;
|
|
8
|
+
/** Stable report timestamp override for tests and reproducible automation. */
|
|
9
|
+
generatedAt?: string;
|
|
10
|
+
}
|
|
11
|
+
interface DocsAgentFeedbackIssueDraft {
|
|
12
|
+
title: string;
|
|
13
|
+
body: string;
|
|
14
|
+
labels: string[];
|
|
15
|
+
}
|
|
16
|
+
interface DocsAgentFeedbackCluster {
|
|
17
|
+
id: string;
|
|
18
|
+
page: string;
|
|
19
|
+
task: string;
|
|
20
|
+
occurrences: number;
|
|
21
|
+
outcomes: string[];
|
|
22
|
+
missingContext: string[];
|
|
23
|
+
docIssues: string[];
|
|
24
|
+
suggestedImprovements: string[];
|
|
25
|
+
goldenTask?: DocsAgentGoldenTask;
|
|
26
|
+
issue: DocsAgentFeedbackIssueDraft;
|
|
27
|
+
}
|
|
28
|
+
interface DocsAgentFeedbackImprovementReport {
|
|
29
|
+
format: typeof DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT;
|
|
30
|
+
generatedAt: string;
|
|
31
|
+
feedbackCount: number;
|
|
32
|
+
failureCount: number;
|
|
33
|
+
recurringClusterCount: number;
|
|
34
|
+
clusters: DocsAgentFeedbackCluster[];
|
|
35
|
+
goldenTasks: DocsAgentGoldenTask[];
|
|
36
|
+
issueDrafts: DocsAgentFeedbackIssueDraft[];
|
|
37
|
+
pullRequestDraft: {
|
|
38
|
+
title: string;
|
|
39
|
+
body: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
declare function analyzeDocsAgentFeedback(feedback: readonly DocsAgentFeedbackData[], options?: DocsAgentFeedbackImprovementOptions): DocsAgentFeedbackImprovementReport;
|
|
43
|
+
declare function readDocsAgentFeedbackFile(filePath: string): DocsAgentFeedbackData[];
|
|
44
|
+
//#endregion
|
|
45
|
+
export { DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT, DocsAgentFeedbackCluster, DocsAgentFeedbackImprovementOptions, DocsAgentFeedbackImprovementReport, DocsAgentFeedbackIssueDraft, analyzeDocsAgentFeedback, readDocsAgentFeedbackFile };
|
|
@@ -193,4 +193,4 @@ function readDocsAgentFeedbackFile(filePath) {
|
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
//#endregion
|
|
196
|
-
export { analyzeDocsAgentFeedback
|
|
196
|
+
export { DOCS_AGENT_FEEDBACK_IMPROVEMENT_FORMAT, analyzeDocsAgentFeedback, readDocsAgentFeedbackFile };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { DocsAgentGoldenTask } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/agent-maintenance.d.ts
|
|
4
|
+
declare const DOCS_AGENT_MAINTENANCE_PROPOSAL_FORMAT: "farming-labs-agent-maintenance-proposals.v1";
|
|
5
|
+
type DocsAgentMaintenanceSignalSource = "agent-feedback" | "ask-ai" | "git" | "issue" | "mcp" | "search" | "support";
|
|
6
|
+
type DocsAgentMaintenanceSeverity = "info" | "warning" | "error" | "critical";
|
|
7
|
+
interface DocsAgentMaintenanceSignal {
|
|
8
|
+
source: DocsAgentMaintenanceSignalSource;
|
|
9
|
+
/** Untrusted evidence summary. It is never interpreted as an instruction. */
|
|
10
|
+
summary: string;
|
|
11
|
+
/** Stable grouping key shared across signal sources. Defaults to task or summary. */
|
|
12
|
+
topic?: string;
|
|
13
|
+
page?: string;
|
|
14
|
+
task?: string;
|
|
15
|
+
severity?: DocsAgentMaintenanceSeverity;
|
|
16
|
+
/** Aggregated occurrence count represented by this signal. @default 1 */
|
|
17
|
+
count?: number;
|
|
18
|
+
}
|
|
19
|
+
interface DocsAgentMaintenanceIssueDraft {
|
|
20
|
+
title: string;
|
|
21
|
+
body: string;
|
|
22
|
+
labels: string[];
|
|
23
|
+
}
|
|
24
|
+
interface DocsAgentMaintenanceProposal {
|
|
25
|
+
id: string;
|
|
26
|
+
page: string;
|
|
27
|
+
topic: string;
|
|
28
|
+
task?: string;
|
|
29
|
+
impactScore: number;
|
|
30
|
+
occurrenceCount: number;
|
|
31
|
+
severity: DocsAgentMaintenanceSeverity;
|
|
32
|
+
sources: DocsAgentMaintenanceSignalSource[];
|
|
33
|
+
evidence: Array<{
|
|
34
|
+
source: DocsAgentMaintenanceSignalSource;
|
|
35
|
+
summary: string;
|
|
36
|
+
count: number;
|
|
37
|
+
}>;
|
|
38
|
+
recommendedActions: string[];
|
|
39
|
+
acceptanceCriteria: string[];
|
|
40
|
+
goldenTask?: DocsAgentGoldenTask;
|
|
41
|
+
issueDraft: DocsAgentMaintenanceIssueDraft;
|
|
42
|
+
}
|
|
43
|
+
interface DocsAgentMaintenanceProposalReport {
|
|
44
|
+
format: typeof DOCS_AGENT_MAINTENANCE_PROPOSAL_FORMAT;
|
|
45
|
+
generatedAt: string;
|
|
46
|
+
signalCount: number;
|
|
47
|
+
representedOccurrences: number;
|
|
48
|
+
proposalCount: number;
|
|
49
|
+
proposals: DocsAgentMaintenanceProposal[];
|
|
50
|
+
goldenTasks: DocsAgentGoldenTask[];
|
|
51
|
+
issueDrafts: DocsAgentMaintenanceIssueDraft[];
|
|
52
|
+
pullRequestDraft: {
|
|
53
|
+
title: string;
|
|
54
|
+
body: string;
|
|
55
|
+
};
|
|
56
|
+
execution: {
|
|
57
|
+
mode: "draft-only";
|
|
58
|
+
writesDocumentation: false;
|
|
59
|
+
publishesChanges: false;
|
|
60
|
+
requiresHumanReview: true;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
interface AnalyzeDocsAgentMaintenanceSignalsOptions {
|
|
64
|
+
/** Minimum represented occurrences required before a proposal is emitted. @default 2 */
|
|
65
|
+
minOccurrences?: number;
|
|
66
|
+
generatedAt?: string;
|
|
67
|
+
}
|
|
68
|
+
declare function analyzeDocsAgentMaintenanceSignals(signals: readonly DocsAgentMaintenanceSignal[], options?: AnalyzeDocsAgentMaintenanceSignalsOptions): DocsAgentMaintenanceProposalReport;
|
|
69
|
+
declare function parseDocsAgentMaintenanceSignals(content: string): DocsAgentMaintenanceSignal[];
|
|
70
|
+
//#endregion
|
|
71
|
+
export { AnalyzeDocsAgentMaintenanceSignalsOptions, DOCS_AGENT_MAINTENANCE_PROPOSAL_FORMAT, DocsAgentMaintenanceIssueDraft, DocsAgentMaintenanceProposal, DocsAgentMaintenanceProposalReport, DocsAgentMaintenanceSeverity, DocsAgentMaintenanceSignal, DocsAgentMaintenanceSignalSource, analyzeDocsAgentMaintenanceSignals, parseDocsAgentMaintenanceSignals };
|
|
@@ -286,4 +286,4 @@ function parseDocsAgentMaintenanceSignals(content) {
|
|
|
286
286
|
}
|
|
287
287
|
|
|
288
288
|
//#endregion
|
|
289
|
-
export { analyzeDocsAgentMaintenanceSignals
|
|
289
|
+
export { DOCS_AGENT_MAINTENANCE_PROPOSAL_FORMAT, analyzeDocsAgentMaintenanceSignals, parseDocsAgentMaintenanceSignals };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/agent-provenance.d.ts
|
|
2
|
+
declare const GENERATED_AGENT_PROVENANCE_MARKER = "@farming-labs/docs:generated";
|
|
3
|
+
declare const GENERATED_AGENT_PROVENANCE_VERSION = 1;
|
|
4
|
+
type GeneratedAgentSourceKind = "resolved-page" | "agent-md";
|
|
5
|
+
interface GeneratedAgentProvenance {
|
|
6
|
+
version: number;
|
|
7
|
+
sourceKind: GeneratedAgentSourceKind;
|
|
8
|
+
sourceHash: string;
|
|
9
|
+
settingsHash: string;
|
|
10
|
+
outputHash: string;
|
|
11
|
+
generatedAt: string;
|
|
12
|
+
}
|
|
13
|
+
interface ParsedGeneratedAgentDocument {
|
|
14
|
+
provenance?: GeneratedAgentProvenance;
|
|
15
|
+
content: string;
|
|
16
|
+
}
|
|
17
|
+
declare function normalizeGeneratedAgentContent(value: string): string;
|
|
18
|
+
declare function hashGeneratedAgentContent(value: string): string;
|
|
19
|
+
declare function parseGeneratedAgentDocument(raw: string): ParsedGeneratedAgentDocument;
|
|
20
|
+
declare function stripGeneratedAgentProvenance(raw: string): string;
|
|
21
|
+
declare function serializeGeneratedAgentDocument(content: string, provenance: GeneratedAgentProvenance): string;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { GENERATED_AGENT_PROVENANCE_MARKER, GENERATED_AGENT_PROVENANCE_VERSION, GeneratedAgentProvenance, GeneratedAgentSourceKind, hashGeneratedAgentContent, normalizeGeneratedAgentContent, parseGeneratedAgentDocument, serializeGeneratedAgentDocument, stripGeneratedAgentProvenance };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//#region src/agent-provenance.ts
|
|
2
|
+
const GENERATED_AGENT_PROVENANCE_MARKER = "@farming-labs/docs:generated";
|
|
3
|
+
const GENERATED_AGENT_PROVENANCE_VERSION = 1;
|
|
4
|
+
function normalizeLineEndings(value) {
|
|
5
|
+
return value.replace(/\r\n?/g, "\n").replace(/^\uFEFF/, "");
|
|
6
|
+
}
|
|
7
|
+
function normalizeGeneratedAgentContent(value) {
|
|
8
|
+
return normalizeLineEndings(value).trimEnd();
|
|
9
|
+
}
|
|
10
|
+
function hashGeneratedAgentContent(value) {
|
|
11
|
+
const normalized = normalizeGeneratedAgentContent(value);
|
|
12
|
+
const bytes = new TextEncoder().encode(normalized);
|
|
13
|
+
let hash = 14695981039346656037n;
|
|
14
|
+
for (const byte of bytes) {
|
|
15
|
+
hash ^= BigInt(byte);
|
|
16
|
+
hash = BigInt.asUintN(64, hash * 1099511628211n);
|
|
17
|
+
}
|
|
18
|
+
return `fnv1a64:${hash.toString(16).padStart(16, "0")}`;
|
|
19
|
+
}
|
|
20
|
+
function parseProvenanceBlock(rawBlock) {
|
|
21
|
+
const entries = /* @__PURE__ */ new Map();
|
|
22
|
+
for (const line of rawBlock.split("\n")) {
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
if (!trimmed) continue;
|
|
25
|
+
const separatorIndex = trimmed.indexOf("=");
|
|
26
|
+
if (separatorIndex <= 0) continue;
|
|
27
|
+
const key = trimmed.slice(0, separatorIndex).trim();
|
|
28
|
+
const value = trimmed.slice(separatorIndex + 1).trim();
|
|
29
|
+
if (!key || !value) continue;
|
|
30
|
+
entries.set(key, value);
|
|
31
|
+
}
|
|
32
|
+
const version = Number.parseInt(entries.get("version") ?? "", 10);
|
|
33
|
+
const sourceKind = entries.get("sourceKind");
|
|
34
|
+
const sourceHash = entries.get("sourceHash");
|
|
35
|
+
const settingsHash = entries.get("settingsHash");
|
|
36
|
+
const outputHash = entries.get("outputHash");
|
|
37
|
+
const generatedAt = entries.get("generatedAt");
|
|
38
|
+
if (!Number.isFinite(version) || sourceKind !== "resolved-page" && sourceKind !== "agent-md" || !sourceHash || !settingsHash || !outputHash || !generatedAt) return;
|
|
39
|
+
return {
|
|
40
|
+
version,
|
|
41
|
+
sourceKind,
|
|
42
|
+
sourceHash,
|
|
43
|
+
settingsHash,
|
|
44
|
+
outputHash,
|
|
45
|
+
generatedAt
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseGeneratedAgentDocument(raw) {
|
|
49
|
+
const normalized = normalizeLineEndings(raw);
|
|
50
|
+
const headerPattern = new RegExp(`^<!-- ${GENERATED_AGENT_PROVENANCE_MARKER}\\n([\\s\\S]*?)\\n-->\\n?`);
|
|
51
|
+
const match = normalized.match(headerPattern);
|
|
52
|
+
if (!match) return { content: normalized };
|
|
53
|
+
return {
|
|
54
|
+
provenance: parseProvenanceBlock(match[1]),
|
|
55
|
+
content: normalized.slice(match[0].length)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function stripGeneratedAgentProvenance(raw) {
|
|
59
|
+
return parseGeneratedAgentDocument(raw).content;
|
|
60
|
+
}
|
|
61
|
+
function serializeGeneratedAgentDocument(content, provenance) {
|
|
62
|
+
const normalizedContent = normalizeGeneratedAgentContent(content);
|
|
63
|
+
return `${[
|
|
64
|
+
`<!-- ${GENERATED_AGENT_PROVENANCE_MARKER}`,
|
|
65
|
+
`version=${provenance.version}`,
|
|
66
|
+
`sourceKind=${provenance.sourceKind}`,
|
|
67
|
+
`sourceHash=${provenance.sourceHash}`,
|
|
68
|
+
`settingsHash=${provenance.settingsHash}`,
|
|
69
|
+
`outputHash=${provenance.outputHash}`,
|
|
70
|
+
`generatedAt=${provenance.generatedAt}`,
|
|
71
|
+
"-->",
|
|
72
|
+
normalizedContent
|
|
73
|
+
].join("\n")}\n`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
export { GENERATED_AGENT_PROVENANCE_MARKER, GENERATED_AGENT_PROVENANCE_VERSION, hashGeneratedAgentContent, normalizeGeneratedAgentContent, parseGeneratedAgentDocument, serializeGeneratedAgentDocument, stripGeneratedAgentProvenance };
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
//#region src/agent-scope.ts
|
|
2
|
+
/** Normalize framework aliases used by page metadata, agent contracts, MCP, and evaluations. */
|
|
3
|
+
function normalizeAgentFramework(value) {
|
|
4
|
+
const normalized = value.toLowerCase().replace(/[^a-z0-9]/gu, "");
|
|
5
|
+
if ([
|
|
6
|
+
"next",
|
|
7
|
+
"nextjs",
|
|
8
|
+
"nextjsapp",
|
|
9
|
+
"reactnext"
|
|
10
|
+
].includes(normalized)) return "nextjs";
|
|
11
|
+
if ([
|
|
12
|
+
"tanstack",
|
|
13
|
+
"tanstackstart",
|
|
14
|
+
"start"
|
|
15
|
+
].includes(normalized)) return "tanstackstart";
|
|
16
|
+
if (["svelte", "sveltekit"].includes(normalized)) return "sveltekit";
|
|
17
|
+
if (["nuxt", "nuxtjs"].includes(normalized)) return "nuxt";
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
function normalizeAgentLocale(value) {
|
|
21
|
+
return value.trim().toLowerCase().replace(/_/gu, "-");
|
|
22
|
+
}
|
|
23
|
+
function normalizeAgentVersion(value) {
|
|
24
|
+
return value.trim().toLowerCase().replace(/^v(?=\d)/u, "");
|
|
25
|
+
}
|
|
26
|
+
function normalizeAgentScopeValues(value) {
|
|
27
|
+
const values = Array.isArray(value) ? value : typeof value === "string" ? [value] : [];
|
|
28
|
+
return Array.from(new Set(values.map((item) => item.trim()).filter(Boolean)));
|
|
29
|
+
}
|
|
30
|
+
function compareVersions(left, right) {
|
|
31
|
+
for (let index = 0; index < 3; index += 1) if (left[index] !== right[index]) return left[index] > right[index] ? 1 : -1;
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
function parseExactVersion(value) {
|
|
35
|
+
const match = normalizeAgentVersion(value).match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-[0-9a-z.-]+)?(?:\+[0-9a-z.-]+)?$/iu);
|
|
36
|
+
if (!match) return void 0;
|
|
37
|
+
return [
|
|
38
|
+
Number(match[1]),
|
|
39
|
+
Number(match[2] ?? 0),
|
|
40
|
+
Number(match[3] ?? 0)
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
function parseVersionOperand(value) {
|
|
44
|
+
const normalized = normalizeAgentVersion(value);
|
|
45
|
+
if (normalized === "*" || normalized === "x") return {
|
|
46
|
+
version: [
|
|
47
|
+
0,
|
|
48
|
+
0,
|
|
49
|
+
0
|
|
50
|
+
],
|
|
51
|
+
components: 0,
|
|
52
|
+
wildcard: true
|
|
53
|
+
};
|
|
54
|
+
const match = normalized.match(/^(\d+)(?:\.(\d+|x|\*))?(?:\.(\d+|x|\*))?$/iu);
|
|
55
|
+
if (!match) return void 0;
|
|
56
|
+
const raw = [
|
|
57
|
+
match[1],
|
|
58
|
+
match[2],
|
|
59
|
+
match[3]
|
|
60
|
+
];
|
|
61
|
+
const wildcardIndex = raw.findIndex((part, index) => index > 0 && (part?.toLowerCase() === "x" || part === "*"));
|
|
62
|
+
if (wildcardIndex >= 0 && raw.slice(wildcardIndex + 1).some((part) => part && part.toLowerCase() !== "x" && part !== "*")) return;
|
|
63
|
+
const components = wildcardIndex >= 0 ? wildcardIndex : raw.filter(Boolean).length;
|
|
64
|
+
return {
|
|
65
|
+
version: [
|
|
66
|
+
Number(raw[0]),
|
|
67
|
+
Number(raw[1] ?? 0) || 0,
|
|
68
|
+
Number(raw[2] ?? 0) || 0
|
|
69
|
+
],
|
|
70
|
+
components,
|
|
71
|
+
wildcard: wildcardIndex >= 0
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function nextVersionBoundary(operand) {
|
|
75
|
+
const [major, minor] = operand.version;
|
|
76
|
+
if (operand.components <= 0) return void 0;
|
|
77
|
+
if (operand.components === 1) return [
|
|
78
|
+
major + 1,
|
|
79
|
+
0,
|
|
80
|
+
0
|
|
81
|
+
];
|
|
82
|
+
return [
|
|
83
|
+
major,
|
|
84
|
+
minor + 1,
|
|
85
|
+
0
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
function operandRange(operand) {
|
|
89
|
+
if (operand.components === 0) return {
|
|
90
|
+
minimumInclusive: true,
|
|
91
|
+
maximumInclusive: false
|
|
92
|
+
};
|
|
93
|
+
if (operand.components < 3 || operand.wildcard) return {
|
|
94
|
+
minimum: operand.version,
|
|
95
|
+
minimumInclusive: true,
|
|
96
|
+
maximum: nextVersionBoundary(operand),
|
|
97
|
+
maximumInclusive: false
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
minimum: operand.version,
|
|
101
|
+
minimumInclusive: true,
|
|
102
|
+
maximum: operand.version,
|
|
103
|
+
maximumInclusive: true
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function caretRange(operand) {
|
|
107
|
+
const [major, minor, patch] = operand.version;
|
|
108
|
+
let maximum;
|
|
109
|
+
if (major > 0) maximum = [
|
|
110
|
+
major + 1,
|
|
111
|
+
0,
|
|
112
|
+
0
|
|
113
|
+
];
|
|
114
|
+
else if (operand.components <= 1) maximum = [
|
|
115
|
+
1,
|
|
116
|
+
0,
|
|
117
|
+
0
|
|
118
|
+
];
|
|
119
|
+
else if (minor > 0 || operand.components === 2) maximum = [
|
|
120
|
+
0,
|
|
121
|
+
minor + 1,
|
|
122
|
+
0
|
|
123
|
+
];
|
|
124
|
+
else maximum = [
|
|
125
|
+
0,
|
|
126
|
+
0,
|
|
127
|
+
patch + 1
|
|
128
|
+
];
|
|
129
|
+
return {
|
|
130
|
+
minimum: operand.version,
|
|
131
|
+
minimumInclusive: true,
|
|
132
|
+
maximum,
|
|
133
|
+
maximumInclusive: false
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function tildeRange(operand) {
|
|
137
|
+
const [major, minor] = operand.version;
|
|
138
|
+
const maximum = operand.components <= 1 ? [
|
|
139
|
+
major + 1,
|
|
140
|
+
0,
|
|
141
|
+
0
|
|
142
|
+
] : [
|
|
143
|
+
major,
|
|
144
|
+
minor + 1,
|
|
145
|
+
0
|
|
146
|
+
];
|
|
147
|
+
return {
|
|
148
|
+
minimum: operand.version,
|
|
149
|
+
minimumInclusive: true,
|
|
150
|
+
maximum,
|
|
151
|
+
maximumInclusive: false
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function intersectRanges(left, right) {
|
|
155
|
+
let minimum = left.minimum;
|
|
156
|
+
let minimumInclusive = left.minimumInclusive;
|
|
157
|
+
if (!minimum || right.minimum && compareVersions(right.minimum, minimum) > 0) {
|
|
158
|
+
minimum = right.minimum;
|
|
159
|
+
minimumInclusive = right.minimumInclusive;
|
|
160
|
+
} else if (right.minimum && compareVersions(right.minimum, minimum) === 0) minimumInclusive = minimumInclusive && right.minimumInclusive;
|
|
161
|
+
let maximum = left.maximum;
|
|
162
|
+
let maximumInclusive = left.maximumInclusive;
|
|
163
|
+
if (!maximum || right.maximum && compareVersions(right.maximum, maximum) < 0) {
|
|
164
|
+
maximum = right.maximum;
|
|
165
|
+
maximumInclusive = right.maximumInclusive;
|
|
166
|
+
} else if (right.maximum && compareVersions(right.maximum, maximum) === 0) maximumInclusive = maximumInclusive && right.maximumInclusive;
|
|
167
|
+
if (minimum && maximum) {
|
|
168
|
+
const compared = compareVersions(minimum, maximum);
|
|
169
|
+
if (compared > 0 || compared === 0 && !(minimumInclusive && maximumInclusive)) return void 0;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
minimum,
|
|
173
|
+
minimumInclusive,
|
|
174
|
+
maximum,
|
|
175
|
+
maximumInclusive
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function comparatorRange(operator, operand) {
|
|
179
|
+
if (!operator || operator === "=") return operandRange(operand);
|
|
180
|
+
if (operator === ">=") return {
|
|
181
|
+
minimum: operand.version,
|
|
182
|
+
minimumInclusive: true,
|
|
183
|
+
maximumInclusive: false
|
|
184
|
+
};
|
|
185
|
+
if (operator === ">") {
|
|
186
|
+
const partialBoundary = operand.components < 3 ? nextVersionBoundary(operand) : void 0;
|
|
187
|
+
return {
|
|
188
|
+
minimum: partialBoundary ?? operand.version,
|
|
189
|
+
minimumInclusive: Boolean(partialBoundary),
|
|
190
|
+
maximumInclusive: false
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (operator === "<") return {
|
|
194
|
+
minimumInclusive: true,
|
|
195
|
+
maximum: operand.version,
|
|
196
|
+
maximumInclusive: false
|
|
197
|
+
};
|
|
198
|
+
const partialBoundary = operand.components < 3 ? nextVersionBoundary(operand) : void 0;
|
|
199
|
+
return {
|
|
200
|
+
minimumInclusive: true,
|
|
201
|
+
maximum: partialBoundary ?? operand.version,
|
|
202
|
+
maximumInclusive: !partialBoundary
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
function parseVersionRangeBranch(value) {
|
|
206
|
+
const branch = normalizeAgentVersion(value).trim();
|
|
207
|
+
if (!branch) return void 0;
|
|
208
|
+
const hyphen = branch.match(/^(.+?)\s+-\s+(.+)$/u);
|
|
209
|
+
if (hyphen) {
|
|
210
|
+
const minimumOperand = parseVersionOperand(hyphen[1]);
|
|
211
|
+
const maximumOperand = parseVersionOperand(hyphen[2]);
|
|
212
|
+
if (!minimumOperand || !maximumOperand) return void 0;
|
|
213
|
+
const maximumBoundary = maximumOperand.components < 3 ? nextVersionBoundary(maximumOperand) : maximumOperand.version;
|
|
214
|
+
return intersectRanges({
|
|
215
|
+
minimum: minimumOperand.version,
|
|
216
|
+
minimumInclusive: true,
|
|
217
|
+
maximumInclusive: false
|
|
218
|
+
}, {
|
|
219
|
+
minimumInclusive: true,
|
|
220
|
+
maximum: maximumBoundary,
|
|
221
|
+
maximumInclusive: maximumOperand.components === 3
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const special = branch.match(/^(\^|~)\s*(.+)$/u);
|
|
225
|
+
if (special) {
|
|
226
|
+
const operand = parseVersionOperand(special[2]);
|
|
227
|
+
if (!operand || operand.components === 0) return void 0;
|
|
228
|
+
return special[1] === "^" ? caretRange(operand) : tildeRange(operand);
|
|
229
|
+
}
|
|
230
|
+
const comparators = Array.from(branch.matchAll(/(>=|<=|>|<|=)\s*([^\s]+)/gu));
|
|
231
|
+
if (comparators.length > 0) {
|
|
232
|
+
if (comparators.map((match) => match[0]).join(" ").replace(/\s+/gu, " ") !== branch.replace(/\s+/gu, " ")) return void 0;
|
|
233
|
+
let range = {
|
|
234
|
+
minimumInclusive: true,
|
|
235
|
+
maximumInclusive: false
|
|
236
|
+
};
|
|
237
|
+
for (const comparator of comparators) {
|
|
238
|
+
const operand = parseVersionOperand(comparator[2]);
|
|
239
|
+
if (!operand) return void 0;
|
|
240
|
+
const next = intersectRanges(range, comparatorRange(comparator[1], operand));
|
|
241
|
+
if (!next) return void 0;
|
|
242
|
+
range = next;
|
|
243
|
+
}
|
|
244
|
+
return range;
|
|
245
|
+
}
|
|
246
|
+
const operand = parseVersionOperand(branch);
|
|
247
|
+
return operand ? operandRange(operand) : void 0;
|
|
248
|
+
}
|
|
249
|
+
function parseVersionRanges(value) {
|
|
250
|
+
return normalizeAgentVersion(value).split("||").map((branch) => parseVersionRangeBranch(branch)).filter((range) => Boolean(range));
|
|
251
|
+
}
|
|
252
|
+
function parseVersionConstraintBranches(value) {
|
|
253
|
+
const ranges = parseVersionRanges(value);
|
|
254
|
+
if (ranges.length > 0) return ranges.map((range) => ({
|
|
255
|
+
kind: "range",
|
|
256
|
+
range
|
|
257
|
+
}));
|
|
258
|
+
const normalized = normalizeAgentVersion(value);
|
|
259
|
+
return normalized ? [{
|
|
260
|
+
kind: "opaque",
|
|
261
|
+
value: normalized
|
|
262
|
+
}] : [];
|
|
263
|
+
}
|
|
264
|
+
function intersectVersionConstraintBranches(left, right) {
|
|
265
|
+
if (left.kind === "opaque" || right.kind === "opaque") return left.kind === "opaque" && right.kind === "opaque" && left.value === right.value ? left : void 0;
|
|
266
|
+
const range = intersectRanges(left.range, right.range);
|
|
267
|
+
return range ? {
|
|
268
|
+
kind: "range",
|
|
269
|
+
range
|
|
270
|
+
} : void 0;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Return true when choosing one alternative from every group can select one shared version.
|
|
274
|
+
*
|
|
275
|
+
* Each inner group is an OR list while the groups themselves are intersected. Computing the
|
|
276
|
+
* accumulated range prevents pairwise matches from accepting three mutually incompatible scopes.
|
|
277
|
+
*/
|
|
278
|
+
function agentVersionConstraintGroupsOverlap(groups) {
|
|
279
|
+
if (groups.length === 0) return false;
|
|
280
|
+
let intersections = groups[0].flatMap(parseVersionConstraintBranches);
|
|
281
|
+
if (intersections.length === 0) return false;
|
|
282
|
+
for (const group of groups.slice(1)) {
|
|
283
|
+
const branches = group.flatMap(parseVersionConstraintBranches);
|
|
284
|
+
if (branches.length === 0) return false;
|
|
285
|
+
intersections = intersections.flatMap((intersection) => branches.map((branch) => intersectVersionConstraintBranches(intersection, branch)).filter((value) => Boolean(value)));
|
|
286
|
+
if (intersections.length === 0) return false;
|
|
287
|
+
}
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
function rangeContains(range, version) {
|
|
291
|
+
if (range.minimum) {
|
|
292
|
+
const compared = compareVersions(version, range.minimum);
|
|
293
|
+
if (compared < 0 || compared === 0 && !range.minimumInclusive) return false;
|
|
294
|
+
}
|
|
295
|
+
if (range.maximum) {
|
|
296
|
+
const compared = compareVersions(version, range.maximum);
|
|
297
|
+
if (compared > 0 || compared === 0 && !range.maximumInclusive) return false;
|
|
298
|
+
}
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
function rangesOverlap(left, right) {
|
|
302
|
+
return Boolean(intersectRanges(left, right));
|
|
303
|
+
}
|
|
304
|
+
/** Match an exact requested version against an exact or range-like documented constraint. */
|
|
305
|
+
function agentVersionConstraintMatches(requested, constraint) {
|
|
306
|
+
if (normalizeAgentVersion(requested) === normalizeAgentVersion(constraint)) return Boolean(normalizeAgentVersion(requested));
|
|
307
|
+
const wanted = parseExactVersion(requested);
|
|
308
|
+
if (!wanted) return false;
|
|
309
|
+
return parseVersionRanges(constraint).some((range) => rangeContains(range, wanted));
|
|
310
|
+
}
|
|
311
|
+
/** Return true when two exact or range-like documented version constraints can select one version. */
|
|
312
|
+
function agentVersionConstraintsOverlap(left, right) {
|
|
313
|
+
const normalizedLeft = normalizeAgentVersion(left);
|
|
314
|
+
if (normalizedLeft === normalizeAgentVersion(right)) return Boolean(normalizedLeft);
|
|
315
|
+
const leftRanges = parseVersionRanges(left);
|
|
316
|
+
const rightRanges = parseVersionRanges(right);
|
|
317
|
+
return leftRanges.some((leftRange) => rightRanges.some((rightRange) => rangesOverlap(leftRange, rightRange)));
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
//#endregion
|
|
321
|
+
export { agentVersionConstraintGroupsOverlap, agentVersionConstraintMatches, agentVersionConstraintsOverlap, normalizeAgentFramework, normalizeAgentLocale, normalizeAgentScopeValues, normalizeAgentVersion };
|