@agentxm/registry-protocol 0.28.4-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +13 -0
  3. package/dist/src/unstable/content/agent-skills-standard.d.ts +17 -0
  4. package/dist/src/unstable/content/agent-skills-standard.js +24 -0
  5. package/dist/src/unstable/content/frontmatter.d.ts +52 -0
  6. package/dist/src/unstable/content/frontmatter.js +115 -0
  7. package/dist/src/unstable/content/index.d.ts +11 -0
  8. package/dist/src/unstable/content/index.js +11 -0
  9. package/dist/src/unstable/content/skill-content.d.ts +43 -0
  10. package/dist/src/unstable/content/skill-content.js +184 -0
  11. package/dist/src/unstable/content/skill-types.d.ts +22 -0
  12. package/dist/src/unstable/content/skill-types.js +9 -0
  13. package/dist/src/unstable/content/subagent-content.d.ts +58 -0
  14. package/dist/src/unstable/content/subagent-content.js +101 -0
  15. package/dist/src/unstable/knowledge/index.d.ts +8 -0
  16. package/dist/src/unstable/knowledge/index.js +8 -0
  17. package/dist/src/unstable/knowledge/knowledge-search.d.ts +32 -0
  18. package/dist/src/unstable/knowledge/knowledge-search.js +147 -0
  19. package/dist/src/unstable/knowledge/okf.d.ts +86 -0
  20. package/dist/src/unstable/knowledge/okf.js +1090 -0
  21. package/dist/src/unstable/lint/catalog/hook/decision-portability.d.ts +4 -0
  22. package/dist/src/unstable/lint/catalog/hook/decision-portability.js +40 -0
  23. package/dist/src/unstable/lint/catalog/hook/entrypoint-exists.d.ts +4 -0
  24. package/dist/src/unstable/lint/catalog/hook/entrypoint-exists.js +39 -0
  25. package/dist/src/unstable/lint/catalog/hook/envelope.d.ts +6 -0
  26. package/dist/src/unstable/lint/catalog/hook/envelope.js +15 -0
  27. package/dist/src/unstable/lint/catalog/hook/matcher-raw-portability.d.ts +4 -0
  28. package/dist/src/unstable/lint/catalog/hook/matcher-raw-portability.js +51 -0
  29. package/dist/src/unstable/lint/catalog/hook.d.ts +4 -0
  30. package/dist/src/unstable/lint/catalog/hook.js +17 -0
  31. package/dist/src/unstable/lint/catalog/knowledge/diagnostics.d.ts +128 -0
  32. package/dist/src/unstable/lint/catalog/knowledge/diagnostics.js +78 -0
  33. package/dist/src/unstable/lint/catalog/knowledge/envelope.d.ts +6 -0
  34. package/dist/src/unstable/lint/catalog/knowledge/envelope.js +15 -0
  35. package/dist/src/unstable/lint/catalog/knowledge.d.ts +5 -0
  36. package/dist/src/unstable/lint/catalog/knowledge.js +11 -0
  37. package/dist/src/unstable/lint/catalog/mcp-server/envelope.d.ts +6 -0
  38. package/dist/src/unstable/lint/catalog/mcp-server/envelope.js +15 -0
  39. package/dist/src/unstable/lint/catalog/mcp-server.d.ts +4 -0
  40. package/dist/src/unstable/lint/catalog/mcp-server.js +6 -0
  41. package/dist/src/unstable/lint/catalog/pack/manifest-keys-recognized.d.ts +28 -0
  42. package/dist/src/unstable/lint/catalog/pack/manifest-keys-recognized.js +38 -0
  43. package/dist/src/unstable/lint/catalog/pack/manifest-present.d.ts +17 -0
  44. package/dist/src/unstable/lint/catalog/pack/manifest-present.js +24 -0
  45. package/dist/src/unstable/lint/catalog/pack/manifest-schema-valid.d.ts +25 -0
  46. package/dist/src/unstable/lint/catalog/pack/manifest-schema-valid.js +33 -0
  47. package/dist/src/unstable/lint/catalog/pack-accessor/contexts.d.ts +51 -0
  48. package/dist/src/unstable/lint/catalog/pack-accessor/contexts.js +45 -0
  49. package/dist/src/unstable/lint/catalog/pack-accessor/vft.d.ts +60 -0
  50. package/dist/src/unstable/lint/catalog/pack-accessor/vft.js +85 -0
  51. package/dist/src/unstable/lint/catalog/pack.d.ts +37 -0
  52. package/dist/src/unstable/lint/catalog/pack.js +47 -0
  53. package/dist/src/unstable/lint/catalog/rule/envelope.d.ts +6 -0
  54. package/dist/src/unstable/lint/catalog/rule/envelope.js +15 -0
  55. package/dist/src/unstable/lint/catalog/rule.d.ts +4 -0
  56. package/dist/src/unstable/lint/catalog/rule.js +6 -0
  57. package/dist/src/unstable/lint/catalog/shared/envelope-rules.d.ts +93 -0
  58. package/dist/src/unstable/lint/catalog/shared/envelope-rules.js +89 -0
  59. package/dist/src/unstable/lint/catalog/shared/manifest-json.d.ts +18 -0
  60. package/dist/src/unstable/lint/catalog/shared/manifest-json.js +28 -0
  61. package/dist/src/unstable/lint/catalog/shared/manifest-present.d.ts +25 -0
  62. package/dist/src/unstable/lint/catalog/shared/manifest-present.js +37 -0
  63. package/dist/src/unstable/lint/catalog/shared/recommended-packs-rules.d.ts +70 -0
  64. package/dist/src/unstable/lint/catalog/shared/recommended-packs-rules.js +139 -0
  65. package/dist/src/unstable/lint/catalog/shared/schema-rule.d.ts +58 -0
  66. package/dist/src/unstable/lint/catalog/shared/schema-rule.js +103 -0
  67. package/dist/src/unstable/lint/catalog/skill/frontmatter-parseable.d.ts +31 -0
  68. package/dist/src/unstable/lint/catalog/skill/frontmatter-parseable.js +148 -0
  69. package/dist/src/unstable/lint/catalog/skill/frontmatter-standard-valid.d.ts +13 -0
  70. package/dist/src/unstable/lint/catalog/skill/frontmatter-standard-valid.js +61 -0
  71. package/dist/src/unstable/lint/catalog/skill/manifest-keys-recognized.d.ts +26 -0
  72. package/dist/src/unstable/lint/catalog/skill/manifest-keys-recognized.js +41 -0
  73. package/dist/src/unstable/lint/catalog/skill/manifest-present.d.ts +23 -0
  74. package/dist/src/unstable/lint/catalog/skill/manifest-present.js +32 -0
  75. package/dist/src/unstable/lint/catalog/skill/manifest-schema-valid.d.ts +21 -0
  76. package/dist/src/unstable/lint/catalog/skill/manifest-schema-valid.js +36 -0
  77. package/dist/src/unstable/lint/catalog/skill/recommended-packs-valid.d.ts +8 -0
  78. package/dist/src/unstable/lint/catalog/skill/recommended-packs-valid.js +12 -0
  79. package/dist/src/unstable/lint/catalog/skill/skill-md-present.d.ts +17 -0
  80. package/dist/src/unstable/lint/catalog/skill/skill-md-present.js +37 -0
  81. package/dist/src/unstable/lint/catalog/skill/standalone-declaration-valid.d.ts +8 -0
  82. package/dist/src/unstable/lint/catalog/skill/standalone-declaration-valid.js +12 -0
  83. package/dist/src/unstable/lint/catalog/skill-accessor/contexts.d.ts +61 -0
  84. package/dist/src/unstable/lint/catalog/skill-accessor/contexts.js +55 -0
  85. package/dist/src/unstable/lint/catalog/skill-accessor/vft.d.ts +77 -0
  86. package/dist/src/unstable/lint/catalog/skill-accessor/vft.js +135 -0
  87. package/dist/src/unstable/lint/catalog/skill.d.ts +44 -0
  88. package/dist/src/unstable/lint/catalog/skill.js +64 -0
  89. package/dist/src/unstable/lint/catalog/subagent/envelope.d.ts +6 -0
  90. package/dist/src/unstable/lint/catalog/subagent/envelope.js +15 -0
  91. package/dist/src/unstable/lint/catalog/subagent.d.ts +4 -0
  92. package/dist/src/unstable/lint/catalog/subagent.js +6 -0
  93. package/dist/src/unstable/lint/compose-path.d.ts +28 -0
  94. package/dist/src/unstable/lint/compose-path.js +64 -0
  95. package/dist/src/unstable/lint/config.d.ts +103 -0
  96. package/dist/src/unstable/lint/config.js +140 -0
  97. package/dist/src/unstable/lint/context.d.ts +246 -0
  98. package/dist/src/unstable/lint/context.js +21 -0
  99. package/dist/src/unstable/lint/describe-document.d.ts +31 -0
  100. package/dist/src/unstable/lint/describe-document.js +50 -0
  101. package/dist/src/unstable/lint/evaluate.d.ts +47 -0
  102. package/dist/src/unstable/lint/evaluate.js +82 -0
  103. package/dist/src/unstable/lint/issues-to-findings.d.ts +35 -0
  104. package/dist/src/unstable/lint/issues-to-findings.js +149 -0
  105. package/dist/src/unstable/lint/publish.d.ts +49 -0
  106. package/dist/src/unstable/lint/publish.js +86 -0
  107. package/dist/src/unstable/lint/rule.d.ts +98 -0
  108. package/dist/src/unstable/lint/rule.js +18 -0
  109. package/dist/src/unstable/publish/archive-guardrails.d.ts +39 -0
  110. package/dist/src/unstable/publish/archive-guardrails.js +250 -0
  111. package/dist/src/unstable/publish/filtered-package-validation.d.ts +24 -0
  112. package/dist/src/unstable/publish/filtered-package-validation.js +117 -0
  113. package/dist/src/unstable/publish/index.d.ts +12 -0
  114. package/dist/src/unstable/publish/index.js +12 -0
  115. package/dist/src/unstable/publish/ingest-limits.d.ts +25 -0
  116. package/dist/src/unstable/publish/ingest-limits.js +41 -0
  117. package/dist/src/unstable/publish/input-normalization.d.ts +40 -0
  118. package/dist/src/unstable/publish/input-normalization.js +125 -0
  119. package/dist/src/unstable/publish/manifest-policy.d.ts +611 -0
  120. package/dist/src/unstable/publish/manifest-policy.js +196 -0
  121. package/dist/src/unstable/publish/test-zip-helpers.d.ts +13 -0
  122. package/dist/src/unstable/publish/test-zip-helpers.js +117 -0
  123. package/dist/src/unstable/publish/visibility.d.ts +161 -0
  124. package/dist/src/unstable/publish/visibility.js +124 -0
  125. package/dist/src/unstable/registry/discover-schema.d.ts +68 -0
  126. package/dist/src/unstable/registry/discover-schema.js +35 -0
  127. package/dist/src/unstable/registry/index.d.ts +9 -0
  128. package/dist/src/unstable/registry/index.js +9 -0
  129. package/dist/src/unstable/registry/publication-set.d.ts +303 -0
  130. package/dist/src/unstable/registry/publication-set.js +507 -0
  131. package/dist/src/unstable/registry/release-age-policy.d.ts +57 -0
  132. package/dist/src/unstable/registry/release-age-policy.js +117 -0
  133. package/dist/src/unstable/registry/schema.d.ts +220 -0
  134. package/dist/src/unstable/registry/schema.js +114 -0
  135. package/dist/src/unstable/suggested-action.d.ts +19 -0
  136. package/dist/src/unstable/suggested-action.js +42 -0
  137. package/package.json +214 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Subagent content file module for subagent content parsing.
3
+ *
4
+ * The content file's YAML frontmatter is largely free-form: only `name` is
5
+ * required and validated. `agentOverrides`, when present, is recognized for
6
+ * use in per-agent rendering. Any other frontmatter keys flow through
7
+ * verbatim to the agent-native file produced by the renderer.
8
+ *
9
+ * @experimental This API is unstable and may change without notice.
10
+ */
11
+ import * as Effect from "effect/Effect";
12
+ import * as Option from "effect/Option";
13
+ declare const SubagentContentError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
14
+ readonly _tag: "SubagentContentError";
15
+ } & Readonly<A>;
16
+ /**
17
+ * Typed failure produced while parsing a subagent content file. Application
18
+ * layers translate this into their own error vocabulary.
19
+ *
20
+ * @experimental This API is unstable and may change without notice.
21
+ */
22
+ export declare class SubagentContentError extends SubagentContentError_base<{
23
+ readonly reason: "frontmatter-parse" | "missing-frontmatter" | "invalid-frontmatter" | "name-mismatch";
24
+ readonly detail: string;
25
+ readonly suggestion?: string;
26
+ readonly cause?: unknown;
27
+ }> {
28
+ }
29
+ /**
30
+ * Map of agent-id → merge patch applied during per-agent rendering.
31
+ *
32
+ * @experimental This API is unstable and may change without notice.
33
+ */
34
+ export type SubagentAgentOverrides = Readonly<Record<string, Readonly<Record<string, unknown>>>>;
35
+ /**
36
+ * Result of parsing a subagent content file.
37
+ *
38
+ * @experimental This API is unstable and may change without notice.
39
+ */
40
+ export interface SubagentContentResult {
41
+ /** The full frontmatter map, opaque except for `name`. Empty when no frontmatter. */
42
+ readonly frontmatter: Option.Option<Readonly<Record<string, unknown>>>;
43
+ /** The `agentOverrides` map keyed by agent id, when present and structurally valid. */
44
+ readonly agentOverrides: Option.Option<SubagentAgentOverrides>;
45
+ /** Content body after the frontmatter block, or full content if no frontmatter. */
46
+ readonly body: string;
47
+ }
48
+ /**
49
+ * Parse a subagent content file into validated frontmatter and body.
50
+ *
51
+ * Validates only that frontmatter is present and that its `name` matches
52
+ * the expected name. All other keys are preserved verbatim.
53
+ *
54
+ * @experimental This API is unstable and may change without notice.
55
+ */
56
+ export declare const parseSubagentMd: (content: string, expectedName: string) => Effect.Effect<SubagentContentResult, SubagentContentError>;
57
+ export {};
58
+ //# sourceMappingURL=subagent-content.d.ts.map
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Subagent content file module for subagent content parsing.
3
+ *
4
+ * The content file's YAML frontmatter is largely free-form: only `name` is
5
+ * required and validated. `agentOverrides`, when present, is recognized for
6
+ * use in per-agent rendering. Any other frontmatter keys flow through
7
+ * verbatim to the agent-native file produced by the renderer.
8
+ *
9
+ * @experimental This API is unstable and may change without notice.
10
+ */
11
+ import * as Data from "effect/Data";
12
+ import * as Effect from "effect/Effect";
13
+ import * as Option from "effect/Option";
14
+ import * as Schema from "effect/Schema";
15
+ import { parseFrontmatterEffect } from "./frontmatter.js";
16
+ /**
17
+ * Typed failure produced while parsing a subagent content file. Application
18
+ * layers translate this into their own error vocabulary.
19
+ *
20
+ * @experimental This API is unstable and may change without notice.
21
+ */
22
+ export class SubagentContentError extends Data.TaggedError("SubagentContentError") {
23
+ }
24
+ /**
25
+ * Schema for the only required frontmatter field — `name`.
26
+ *
27
+ * Used to validate that `name` is present and a string. The full frontmatter
28
+ * map is preserved verbatim and surfaced as `frontmatter`.
29
+ */
30
+ const NameOnlySchema = Schema.Struct({
31
+ name: Schema.String,
32
+ }).annotate({
33
+ identifier: "SubagentFrontmatterName",
34
+ description: "Required `name` field for subagent frontmatter.",
35
+ });
36
+ const isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
37
+ const extractAgentOverrides = (fm) => {
38
+ const raw = fm["agentOverrides"];
39
+ if (!isPlainObject(raw))
40
+ return Option.none();
41
+ const out = {};
42
+ for (const [agentId, patch] of Object.entries(raw)) {
43
+ if (isPlainObject(patch))
44
+ out[agentId] = patch;
45
+ }
46
+ return Option.some(out);
47
+ };
48
+ /**
49
+ * Parse a subagent content file into validated frontmatter and body.
50
+ *
51
+ * Validates only that frontmatter is present and that its `name` matches
52
+ * the expected name. All other keys are preserved verbatim.
53
+ *
54
+ * @experimental This API is unstable and may change without notice.
55
+ */
56
+ export const parseSubagentMd = (content, expectedName) => Effect.gen(function* () {
57
+ const parsed = yield* parseFrontmatterEffect(content).pipe(Effect.mapError((cause) => new SubagentContentError({
58
+ reason: "frontmatter-parse",
59
+ detail: "YAML frontmatter could not be parsed",
60
+ suggestion: "Ensure the frontmatter block contains valid YAML between --- delimiters.",
61
+ cause,
62
+ })));
63
+ if (parsed.frontmatter === undefined) {
64
+ return yield* new SubagentContentError({
65
+ reason: "missing-frontmatter",
66
+ detail: `Missing subagent frontmatter for "${expectedName}"`,
67
+ suggestion: `Add YAML frontmatter with name: ${expectedName}.`,
68
+ });
69
+ }
70
+ yield* Effect.try({
71
+ try: () => Schema.decodeUnknownSync(NameOnlySchema)(parsed.frontmatter),
72
+ catch: (error) => new SubagentContentError({
73
+ reason: "invalid-frontmatter",
74
+ detail: "Invalid subagent frontmatter",
75
+ suggestion: "Frontmatter must include a string `name` field.",
76
+ cause: error,
77
+ }),
78
+ });
79
+ if (!isPlainObject(parsed.frontmatter)) {
80
+ return yield* new SubagentContentError({
81
+ reason: "invalid-frontmatter",
82
+ detail: "Subagent frontmatter must be a YAML mapping",
83
+ suggestion: `Add YAML frontmatter with name: ${expectedName}.`,
84
+ });
85
+ }
86
+ const fm = parsed.frontmatter;
87
+ const name = fm["name"];
88
+ if (name !== expectedName) {
89
+ return yield* new SubagentContentError({
90
+ reason: "name-mismatch",
91
+ detail: `Subagent frontmatter name "${String(name)}" does not match expected name "${expectedName}"`,
92
+ suggestion: `Set subagent.json name, frontmatter name, and filename to ${expectedName}.`,
93
+ });
94
+ }
95
+ return {
96
+ frontmatter: Option.some(fm),
97
+ agentOverrides: extractAgentOverrides(fm),
98
+ body: parsed.body,
99
+ };
100
+ });
101
+ //# sourceMappingURL=subagent-content.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Area barrel for the package public surface.
3
+ *
4
+ * @experimental This API is unstable and may change without notice.
5
+ */
6
+ export { KNOWLEDGE_SEARCH_TOKENIZER_PROFILE, type KnowledgeSearchClause, type KnowledgeSearchQuery, type KnowledgeSearchQueryParseResult, matchesKnowledgeSearchQuery, parseKnowledgeSearchQuery, tokenizeKnowledgeSearchText, } from "./knowledge-search.js";
7
+ export { KNOWLEDGE_DIAGNOSTIC_CODES, type KnowledgeActorRecord, type KnowledgeAuthoredLink, type KnowledgeBundleEntry, type KnowledgeConcept, type KnowledgeDiagnostic, type KnowledgeDiagnosticCode, type KnowledgeDocumentKind, type KnowledgeFrontmatterParseDetails, type KnowledgeInspection, type KnowledgeTrustTier, collectKnowledgeBundleEntries, inspectKnowledgeBundle, inspectKnowledgeEntries, openKnowledgeConcept, searchKnowledgeConcepts, } from "./okf.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Area barrel for the package public surface.
3
+ *
4
+ * @experimental This API is unstable and may change without notice.
5
+ */
6
+ export { KNOWLEDGE_SEARCH_TOKENIZER_PROFILE, matchesKnowledgeSearchQuery, parseKnowledgeSearchQuery, tokenizeKnowledgeSearchText, } from "./knowledge-search.js";
7
+ export { KNOWLEDGE_DIAGNOSTIC_CODES, collectKnowledgeBundleEntries, inspectKnowledgeBundle, inspectKnowledgeEntries, openKnowledgeConcept, searchKnowledgeConcepts, } from "./okf.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,32 @@
1
+ import type { KnowledgeConcept } from "./okf.js";
2
+ export declare const KNOWLEDGE_SEARCH_TOKENIZER_PROFILE: {
3
+ readonly id: "axm-knowledge-lexical-v1";
4
+ readonly unicodeNormalization: "NFKC";
5
+ readonly caseNormalization: "unicode-case-fold";
6
+ readonly termBoundary: "unicode-whitespace-punctuation-camel-code";
7
+ readonly stemming: false;
8
+ };
9
+ export type KnowledgeSearchClause = {
10
+ readonly kind: "term";
11
+ readonly token: string;
12
+ } | {
13
+ readonly kind: "phrase";
14
+ readonly tokens: ReadonlyArray<string>;
15
+ } | {
16
+ readonly kind: "literal";
17
+ readonly value: string;
18
+ };
19
+ export interface KnowledgeSearchQuery {
20
+ readonly clauses: ReadonlyArray<KnowledgeSearchClause>;
21
+ }
22
+ export type KnowledgeSearchQueryParseResult = {
23
+ readonly ok: true;
24
+ readonly query: KnowledgeSearchQuery;
25
+ } | {
26
+ readonly ok: false;
27
+ readonly detail: string;
28
+ };
29
+ export declare const tokenizeKnowledgeSearchText: (value: string) => ReadonlyArray<string>;
30
+ export declare const parseKnowledgeSearchQuery: (input: string) => KnowledgeSearchQueryParseResult;
31
+ export declare const matchesKnowledgeSearchQuery: (concept: KnowledgeConcept, query: KnowledgeSearchQuery) => boolean;
32
+ //# sourceMappingURL=knowledge-search.d.ts.map
@@ -0,0 +1,147 @@
1
+ export const KNOWLEDGE_SEARCH_TOKENIZER_PROFILE = {
2
+ id: "axm-knowledge-lexical-v1",
3
+ unicodeNormalization: "NFKC",
4
+ caseNormalization: "unicode-case-fold",
5
+ termBoundary: "unicode-whitespace-punctuation-camel-code",
6
+ stemming: false,
7
+ };
8
+ const normalizeTokenSource = (value) => value
9
+ .normalize("NFKC")
10
+ .replace(/([\p{Ll}\p{N}])(\p{Lu})/gu, "$1 $2")
11
+ .replace(/(\p{Lu})(\p{Lu}\p{Ll})/gu, "$1 $2")
12
+ .replace(/(\p{L})(\p{N})/gu, "$1 $2")
13
+ .replace(/(\p{N})(\p{L})/gu, "$1 $2")
14
+ // ECMAScript does not expose Unicode's CaseFolding.txt operation directly.
15
+ // Upper-then-lower handles multi-character folds such as ß -> ss while
16
+ // remaining deterministic and locale-independent.
17
+ .toUpperCase()
18
+ .toLowerCase();
19
+ export const tokenizeKnowledgeSearchText = (value) => normalizeTokenSource(value).match(/[\p{L}\p{M}\p{N}]+/gu) ?? [];
20
+ const normalizeLiteral = (value) => value.normalize("NFC").toLowerCase();
21
+ const parseQuotedValue = (input, quoteIndex) => {
22
+ let value = "";
23
+ let escaped = false;
24
+ for (let index = quoteIndex + 1; index < input.length; index += 1) {
25
+ const character = input[index];
26
+ if (character === undefined)
27
+ break;
28
+ if (escaped) {
29
+ value += character;
30
+ escaped = false;
31
+ continue;
32
+ }
33
+ if (character === "\\") {
34
+ escaped = true;
35
+ continue;
36
+ }
37
+ if (character === '"') {
38
+ return { ok: true, value, nextIndex: index + 1 };
39
+ }
40
+ value += character;
41
+ }
42
+ return { ok: false };
43
+ };
44
+ const addOrdinaryTerms = (clauses, value) => {
45
+ for (const token of tokenizeKnowledgeSearchText(value)) {
46
+ clauses.push({ kind: "term", token });
47
+ }
48
+ };
49
+ const startsWithLiteralOperator = (input, index) => input.slice(index, index + "literal:".length).toLowerCase() === "literal:";
50
+ export const parseKnowledgeSearchQuery = (input) => {
51
+ const clauses = [];
52
+ let index = 0;
53
+ while (index < input.length) {
54
+ if (/\s/u.test(input[index] ?? "")) {
55
+ index += 1;
56
+ continue;
57
+ }
58
+ if (startsWithLiteralOperator(input, index)) {
59
+ index += "literal:".length;
60
+ if (input[index] === '"') {
61
+ const quoted = parseQuotedValue(input, index);
62
+ if (!quoted.ok) {
63
+ return { ok: false, detail: "Explicit literals must end with a closing quote." };
64
+ }
65
+ if (quoted.value.trim().length === 0) {
66
+ return { ok: false, detail: "Explicit literals cannot be empty." };
67
+ }
68
+ clauses.push({ kind: "literal", value: normalizeLiteral(quoted.value) });
69
+ index = quoted.nextIndex;
70
+ continue;
71
+ }
72
+ const end = input.slice(index).search(/\s/u);
73
+ const nextIndex = end === -1 ? input.length : index + end;
74
+ const value = input.slice(index, nextIndex);
75
+ if (value.length === 0) {
76
+ return { ok: false, detail: "Explicit literals cannot be empty." };
77
+ }
78
+ clauses.push({ kind: "literal", value: normalizeLiteral(value) });
79
+ index = nextIndex;
80
+ continue;
81
+ }
82
+ if (input[index] === '"') {
83
+ const quoted = parseQuotedValue(input, index);
84
+ if (!quoted.ok) {
85
+ return { ok: false, detail: "Quoted phrases must end with a closing quote." };
86
+ }
87
+ if (quoted.value.length === 0) {
88
+ return { ok: false, detail: "Quoted phrases cannot be empty." };
89
+ }
90
+ const tokens = tokenizeKnowledgeSearchText(quoted.value);
91
+ if (tokens.length === 0) {
92
+ return {
93
+ ok: false,
94
+ detail: "Quoted phrases must contain at least one searchable token.",
95
+ };
96
+ }
97
+ clauses.push({ kind: "phrase", tokens });
98
+ index = quoted.nextIndex;
99
+ continue;
100
+ }
101
+ let end = index;
102
+ while (end < input.length && !/\s/u.test(input[end] ?? "") && input[end] !== '"') {
103
+ end += 1;
104
+ }
105
+ addOrdinaryTerms(clauses, input.slice(index, end));
106
+ index = end;
107
+ }
108
+ return clauses.length === 0
109
+ ? { ok: false, detail: "Search query must contain at least one term, phrase, or literal." }
110
+ : { ok: true, query: { clauses } };
111
+ };
112
+ const containsPhrase = (fieldTokens, phraseTokens) => {
113
+ if (phraseTokens.length > fieldTokens.length)
114
+ return false;
115
+ const finalStart = fieldTokens.length - phraseTokens.length;
116
+ for (let start = 0; start <= finalStart; start += 1) {
117
+ if (phraseTokens.every((token, offset) => fieldTokens[start + offset] === token))
118
+ return true;
119
+ }
120
+ return false;
121
+ };
122
+ const searchableFields = (concept) => [
123
+ concept.id,
124
+ concept.title,
125
+ ...(concept.description === undefined ? [] : [concept.description]),
126
+ ...(concept.tags ?? []),
127
+ ...(concept.type === undefined ? [] : [concept.type]),
128
+ concept.body,
129
+ ];
130
+ export const matchesKnowledgeSearchQuery = (concept, query) => {
131
+ const fields = searchableFields(concept);
132
+ const tokenFields = fields.map(tokenizeKnowledgeSearchText);
133
+ const literalFields = fields.map(normalizeLiteral);
134
+ return query.clauses.every((clause) => {
135
+ switch (clause.kind) {
136
+ case "term":
137
+ return tokenFields.some((tokens) => tokens.includes(clause.token));
138
+ case "phrase":
139
+ return tokenFields.some((tokens) => containsPhrase(tokens, clause.tokens));
140
+ case "literal":
141
+ return literalFields.some((field) => field.includes(clause.value));
142
+ default:
143
+ return clause;
144
+ }
145
+ });
146
+ };
147
+ //# sourceMappingURL=knowledge-search.js.map
@@ -0,0 +1,86 @@
1
+ /** Open Knowledge Format discovery and AgentXM-profile validation (v0.2). */
2
+ import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Path from "effect/Path";
5
+ import { FrontmatterParseFailure } from "../content/frontmatter.js";
6
+ import { type KnowledgeSearchQuery } from "./knowledge-search.js";
7
+ /** OKF dialect versions this inspector understands. */
8
+ export type OkfVersion = "0.2";
9
+ /** Actor that produced or confirmed a concept, per the OKF actor convention. */
10
+ export interface KnowledgeActorRecord {
11
+ readonly by: string;
12
+ readonly at?: string;
13
+ }
14
+ /**
15
+ * Trust tier derived from `verified`, per OKF 0.2. A concept is
16
+ * `human-reviewed` when any verifier is a `human:<id>` actor,
17
+ * `machine-confirmed` when verified only by non-human actors, and
18
+ * `unverified` when `verified` is absent.
19
+ */
20
+ export type KnowledgeTrustTier = "unverified" | "machine-confirmed" | "human-reviewed";
21
+ export type KnowledgeDocumentKind = "concept" | "index" | "log";
22
+ /** An authored Markdown link and the bundle-local concept it resolves to, when any. */
23
+ export interface KnowledgeAuthoredLink {
24
+ readonly target: string;
25
+ readonly line: number;
26
+ readonly resolvedConceptId?: string;
27
+ }
28
+ export interface KnowledgeConcept {
29
+ readonly id: string;
30
+ readonly kind: KnowledgeDocumentKind;
31
+ readonly title: string;
32
+ /** The authored level-one heading, absent when `title` fell back to the concept ID. */
33
+ readonly authoredTitle?: string;
34
+ readonly frontmatter?: Readonly<Record<string, unknown>>;
35
+ readonly type?: string;
36
+ readonly description?: string;
37
+ readonly tags?: ReadonlyArray<string>;
38
+ readonly resource?: string;
39
+ readonly status?: string;
40
+ readonly staleAfter?: string;
41
+ readonly generated?: KnowledgeActorRecord;
42
+ readonly verified?: ReadonlyArray<KnowledgeActorRecord>;
43
+ readonly trust?: KnowledgeTrustTier;
44
+ readonly authoredLinks: ReadonlyArray<KnowledgeAuthoredLink>;
45
+ readonly relativePath: string;
46
+ readonly body: string;
47
+ }
48
+ export declare const KNOWLEDGE_DIAGNOSTIC_CODES: readonly ["bundle-too-large", "file-too-large", "invalid-tags", "missing-root-index", "missing-okf-version", "missing-title", "missing-description", "missing-manifest-description", "empty-bundle", "missing-tags", "symbolic-link", "too-many-files", "unsupported-okf-version", "missing-type", "invalid-frontmatter", "case-collision", "dangerous-uri", "detected-secret", "unsafe-path", "invalid-index", "invalid-log", "invalid-resource", "escaping-resource", "unresolved-resource", "broken-internal-link", "escaping-link", "unreachable-concept", "missing-index-entry", "stale-index-entry", "embedded-html", "duplicate-resource", "inconsistent-type", "large-concept", "large-index", "unreferenced-asset", "invalid-sources", "invalid-generated", "invalid-verified", "invalid-status", "invalid-stale-after", "invalid-attestation"];
49
+ export type KnowledgeDiagnosticCode = (typeof KNOWLEDGE_DIAGNOSTIC_CODES)[number];
50
+ export interface KnowledgeFrontmatterParseDetails {
51
+ readonly kind: "frontmatter-parse";
52
+ readonly reason: string;
53
+ }
54
+ export interface KnowledgeDiagnostic {
55
+ readonly code: KnowledgeDiagnosticCode;
56
+ readonly severity: "error" | "warning";
57
+ readonly relativePath: string;
58
+ readonly line?: number;
59
+ readonly column?: number;
60
+ readonly message: string;
61
+ readonly details?: KnowledgeFrontmatterParseDetails;
62
+ }
63
+ /** Convert a typed frontmatter failure into the stable Knowledge diagnostic contract. */
64
+ export declare const frontmatterParseDiagnostic: (relativePath: string, failure: FrontmatterParseFailure) => KnowledgeDiagnostic;
65
+ export interface KnowledgeInspection {
66
+ readonly concepts: ReadonlyArray<KnowledgeConcept>;
67
+ readonly diagnostics: ReadonlyArray<KnowledgeDiagnostic>;
68
+ /** Canonical dialect required at the bundle root. */
69
+ readonly okfVersion: OkfVersion;
70
+ }
71
+ export interface KnowledgeBundleEntry {
72
+ readonly relativePath: string;
73
+ readonly type: FileSystem.File.Type;
74
+ readonly size: bigint;
75
+ }
76
+ /** Collect a bundle's normalized entry inventory without following symbolic links. */
77
+ export declare const collectKnowledgeBundleEntries: (sourceRoot: string) => Effect.Effect<ReadonlyArray<KnowledgeBundleEntry>, unknown, FileSystem.FileSystem | Path.Path>;
78
+ /**
79
+ * Inspect a canonical OKF 0.2 bundle. The root index requirement is an explicit
80
+ * AgentXM profile constraint; upstream OKF permits a root without it.
81
+ */
82
+ export declare const inspectKnowledgeEntries: <E>(entries: ReadonlyArray<KnowledgeBundleEntry>, readMarkdown: (relativePath: string) => Effect.Effect<string, E>) => Effect.Effect<KnowledgeInspection, E>;
83
+ export declare const inspectKnowledgeBundle: (sourceRoot: string) => Effect.Effect<KnowledgeInspection, unknown, FileSystem.FileSystem | Path.Path>;
84
+ export declare const searchKnowledgeConcepts: (concepts: ReadonlyArray<KnowledgeConcept>, query: KnowledgeSearchQuery) => ReadonlyArray<KnowledgeConcept>;
85
+ export declare const openKnowledgeConcept: (concepts: ReadonlyArray<KnowledgeConcept>, id: string) => KnowledgeConcept | undefined;
86
+ //# sourceMappingURL=okf.d.ts.map