@agentxm/workspace-state 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 (215) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +11 -0
  3. package/dist/src/index.d.ts +72 -0
  4. package/dist/src/index.js +88 -0
  5. package/dist/src/knowledge/discovery-config.d.ts +12 -0
  6. package/dist/src/knowledge/discovery-config.js +9 -0
  7. package/dist/src/lockfile/accepted-registry-version.d.ts +12 -0
  8. package/dist/src/lockfile/accepted-registry-version.js +13 -0
  9. package/dist/src/lockfile/entry-fields.d.ts +189 -0
  10. package/dist/src/lockfile/entry-fields.js +89 -0
  11. package/dist/src/lockfile/errors.d.ts +48 -0
  12. package/dist/src/lockfile/errors.js +27 -0
  13. package/dist/src/lockfile/index.d.ts +18 -0
  14. package/dist/src/lockfile/index.js +16 -0
  15. package/dist/src/lockfile/lockfile.d.ts +2255 -0
  16. package/dist/src/lockfile/lockfile.js +235 -0
  17. package/dist/src/lockfile/resolved-version.d.ts +4 -0
  18. package/dist/src/lockfile/resolved-version.js +7 -0
  19. package/dist/src/lockfile/schema.d.ts +3062 -0
  20. package/dist/src/lockfile/schema.js +406 -0
  21. package/dist/src/schema/index.d.ts +3 -0
  22. package/dist/src/schema/index.js +2 -0
  23. package/dist/src/schema/read-and-validate-json-file.d.ts +20 -0
  24. package/dist/src/schema/read-and-validate-json-file.js +85 -0
  25. package/dist/src/schema/types.d.ts +26 -0
  26. package/dist/src/schema/types.js +2 -0
  27. package/dist/src/settings/errors.d.ts +22 -0
  28. package/dist/src/settings/errors.js +15 -0
  29. package/dist/src/settings/format-preserving-json.d.ts +40 -0
  30. package/dist/src/settings/format-preserving-json.js +80 -0
  31. package/dist/src/settings/index.d.ts +15 -0
  32. package/dist/src/settings/index.js +14 -0
  33. package/dist/src/settings/schema.d.ts +687 -0
  34. package/dist/src/settings/schema.js +977 -0
  35. package/dist/src/settings/settings.d.ts +38 -0
  36. package/dist/src/settings/settings.js +213 -0
  37. package/dist/src/testing.d.ts +17 -0
  38. package/dist/src/testing.js +17 -0
  39. package/dist/src/utils/atomic-write.d.ts +67 -0
  40. package/dist/src/utils/atomic-write.js +71 -0
  41. package/dist/src/utils/environment.d.ts +16 -0
  42. package/dist/src/utils/environment.js +19 -0
  43. package/dist/src/utils/path-safety.d.ts +25 -0
  44. package/dist/src/utils/path-safety.js +34 -0
  45. package/dist/src/utils/resolve-parent-symlinks.d.ts +16 -0
  46. package/dist/src/utils/resolve-parent-symlinks.js +36 -0
  47. package/dist/src/workspace/accepted-canonical-ref.d.ts +58 -0
  48. package/dist/src/workspace/accepted-canonical-ref.js +229 -0
  49. package/dist/src/workspace/artifact-change.d.ts +14 -0
  50. package/dist/src/workspace/artifact-change.js +18 -0
  51. package/dist/src/workspace/canonical-observation.d.ts +39 -0
  52. package/dist/src/workspace/canonical-observation.js +307 -0
  53. package/dist/src/workspace/configured-agent-outcome.d.ts +22 -0
  54. package/dist/src/workspace/configured-agent-outcome.js +33 -0
  55. package/dist/src/workspace/configured-agent-outcomes-provider.d.ts +50 -0
  56. package/dist/src/workspace/configured-agent-outcomes-provider.js +26 -0
  57. package/dist/src/workspace/configured-agent-outcomes.d.ts +48 -0
  58. package/dist/src/workspace/configured-agent-outcomes.js +113 -0
  59. package/dist/src/workspace/configured-entry-resolution/types.d.ts +32 -0
  60. package/dist/src/workspace/configured-entry-resolution/types.js +2 -0
  61. package/dist/src/workspace/configured-entry-resolution/workspace-ref.d.ts +32 -0
  62. package/dist/src/workspace/configured-entry-resolution/workspace-ref.js +176 -0
  63. package/dist/src/workspace/constants.d.ts +6 -0
  64. package/dist/src/workspace/constants.js +6 -0
  65. package/dist/src/workspace/create-symlink.d.ts +26 -0
  66. package/dist/src/workspace/create-symlink.js +87 -0
  67. package/dist/src/workspace/desired-pack-lock.d.ts +18 -0
  68. package/dist/src/workspace/desired-pack-lock.js +132 -0
  69. package/dist/src/workspace/desired-state-enabled.d.ts +18 -0
  70. package/dist/src/workspace/desired-state-enabled.js +16 -0
  71. package/dist/src/workspace/desired-state-graph.d.ts +114 -0
  72. package/dist/src/workspace/desired-state-graph.js +384 -0
  73. package/dist/src/workspace/desired-state-problem-text.d.ts +6 -0
  74. package/dist/src/workspace/desired-state-problem-text.js +27 -0
  75. package/dist/src/workspace/errors.d.ts +184 -0
  76. package/dist/src/workspace/errors.js +79 -0
  77. package/dist/src/workspace/extension-name.d.ts +28 -0
  78. package/dist/src/workspace/extension-name.js +66 -0
  79. package/dist/src/workspace/extension-paths.d.ts +82 -0
  80. package/dist/src/workspace/extension-paths.js +172 -0
  81. package/dist/src/workspace/footprint-recorder.d.ts +30 -0
  82. package/dist/src/workspace/footprint-recorder.js +32 -0
  83. package/dist/src/workspace/layout.d.ts +43 -0
  84. package/dist/src/workspace/layout.js +164 -0
  85. package/dist/src/workspace/lock-entry-to-ref.d.ts +40 -0
  86. package/dist/src/workspace/lock-entry-to-ref.js +433 -0
  87. package/dist/src/workspace/lock-entry-to-source-params.d.ts +26 -0
  88. package/dist/src/workspace/lock-entry-to-source-params.js +81 -0
  89. package/dist/src/workspace/locked-entries.d.ts +30 -0
  90. package/dist/src/workspace/locked-entries.js +34 -0
  91. package/dist/src/workspace/materialized-file-target.d.ts +14 -0
  92. package/dist/src/workspace/materialized-file-target.js +14 -0
  93. package/dist/src/workspace/materialized-tree.d.ts +23 -0
  94. package/dist/src/workspace/materialized-tree.js +90 -0
  95. package/dist/src/workspace/mcp-entry-semantics.d.ts +31 -0
  96. package/dist/src/workspace/mcp-entry-semantics.js +60 -0
  97. package/dist/src/workspace/observed-installed.d.ts +9 -0
  98. package/dist/src/workspace/observed-installed.js +9 -0
  99. package/dist/src/workspace/pack-manifest-content-identity.d.ts +12 -0
  100. package/dist/src/workspace/pack-manifest-content-identity.js +20 -0
  101. package/dist/src/workspace/pack-paths.d.ts +24 -0
  102. package/dist/src/workspace/pack-paths.js +16 -0
  103. package/dist/src/workspace/package-hash.d.ts +25 -0
  104. package/dist/src/workspace/package-hash.js +45 -0
  105. package/dist/src/workspace/paths.d.ts +24 -0
  106. package/dist/src/workspace/paths.js +52 -0
  107. package/dist/src/workspace/read-model/__fixtures__/builder.d.ts +199 -0
  108. package/dist/src/workspace/read-model/__fixtures__/builder.js +588 -0
  109. package/dist/src/workspace/read-model/__fixtures__/decoders.d.ts +15 -0
  110. package/dist/src/workspace/read-model/__fixtures__/decoders.js +15 -0
  111. package/dist/src/workspace/read-model/__fixtures__/occurrences.d.ts +72 -0
  112. package/dist/src/workspace/read-model/__fixtures__/occurrences.js +134 -0
  113. package/dist/src/workspace/read-model/__fixtures__/scenario-harness.d.ts +99 -0
  114. package/dist/src/workspace/read-model/__fixtures__/scenario-harness.js +142 -0
  115. package/dist/src/workspace/read-model/__fixtures__/test-layer.d.ts +60 -0
  116. package/dist/src/workspace/read-model/__fixtures__/test-layer.js +57 -0
  117. package/dist/src/workspace/read-model/agent-presence.d.ts +32 -0
  118. package/dist/src/workspace/read-model/agent-presence.js +21 -0
  119. package/dist/src/workspace/read-model/agent-root-resolver.d.ts +38 -0
  120. package/dist/src/workspace/read-model/agent-root-resolver.js +35 -0
  121. package/dist/src/workspace/read-model/agents/index.d.ts +38 -0
  122. package/dist/src/workspace/read-model/agents/index.js +45 -0
  123. package/dist/src/workspace/read-model/agents/shared.d.ts +27 -0
  124. package/dist/src/workspace/read-model/agents/shared.js +63 -0
  125. package/dist/src/workspace/read-model/agents/types.d.ts +133 -0
  126. package/dist/src/workspace/read-model/agents/types.js +51 -0
  127. package/dist/src/workspace/read-model/diagnostics.d.ts +18 -0
  128. package/dist/src/workspace/read-model/diagnostics.js +14 -0
  129. package/dist/src/workspace/read-model/discovery/index.d.ts +5 -0
  130. package/dist/src/workspace/read-model/discovery/index.js +5 -0
  131. package/dist/src/workspace/read-model/discovery/plugin-manifests.d.ts +16 -0
  132. package/dist/src/workspace/read-model/discovery/plugin-manifests.js +168 -0
  133. package/dist/src/workspace/read-model/discovery/skills.d.ts +58 -0
  134. package/dist/src/workspace/read-model/discovery/skills.js +263 -0
  135. package/dist/src/workspace/read-model/discovery/subagents.d.ts +37 -0
  136. package/dist/src/workspace/read-model/discovery/subagents.js +48 -0
  137. package/dist/src/workspace/read-model/errors.d.ts +93 -0
  138. package/dist/src/workspace/read-model/errors.js +30 -0
  139. package/dist/src/workspace/read-model/extensions/actual-helpers.d.ts +4 -0
  140. package/dist/src/workspace/read-model/extensions/actual-helpers.js +4 -0
  141. package/dist/src/workspace/read-model/extensions/hook.d.ts +104 -0
  142. package/dist/src/workspace/read-model/extensions/hook.js +119 -0
  143. package/dist/src/workspace/read-model/extensions/index.d.ts +19 -0
  144. package/dist/src/workspace/read-model/extensions/index.js +43 -0
  145. package/dist/src/workspace/read-model/extensions/indexByName.d.ts +31 -0
  146. package/dist/src/workspace/read-model/extensions/indexByName.js +30 -0
  147. package/dist/src/workspace/read-model/extensions/inventory.d.ts +99 -0
  148. package/dist/src/workspace/read-model/extensions/inventory.js +111 -0
  149. package/dist/src/workspace/read-model/extensions/knowledge.d.ts +101 -0
  150. package/dist/src/workspace/read-model/extensions/knowledge.js +121 -0
  151. package/dist/src/workspace/read-model/extensions/mcp-server.d.ts +106 -0
  152. package/dist/src/workspace/read-model/extensions/mcp-server.js +122 -0
  153. package/dist/src/workspace/read-model/extensions/pack.d.ts +104 -0
  154. package/dist/src/workspace/read-model/extensions/pack.js +123 -0
  155. package/dist/src/workspace/read-model/extensions/package-root.d.ts +39 -0
  156. package/dist/src/workspace/read-model/extensions/package-root.js +48 -0
  157. package/dist/src/workspace/read-model/extensions/projection.d.ts +137 -0
  158. package/dist/src/workspace/read-model/extensions/projection.js +180 -0
  159. package/dist/src/workspace/read-model/extensions/rule.d.ts +104 -0
  160. package/dist/src/workspace/read-model/extensions/rule.js +113 -0
  161. package/dist/src/workspace/read-model/extensions/skill.d.ts +170 -0
  162. package/dist/src/workspace/read-model/extensions/skill.js +148 -0
  163. package/dist/src/workspace/read-model/extensions/subagent.d.ts +97 -0
  164. package/dist/src/workspace/read-model/extensions/subagent.js +120 -0
  165. package/dist/src/workspace/read-model/scanners/agent-dir.d.ts +49 -0
  166. package/dist/src/workspace/read-model/scanners/agent-dir.js +180 -0
  167. package/dist/src/workspace/read-model/scanners/agent-root.d.ts +73 -0
  168. package/dist/src/workspace/read-model/scanners/agent-root.js +148 -0
  169. package/dist/src/workspace/read-model/scanners/agent-settings.d.ts +43 -0
  170. package/dist/src/workspace/read-model/scanners/agent-settings.js +54 -0
  171. package/dist/src/workspace/read-model/scanners/canonical-extensions.d.ts +48 -0
  172. package/dist/src/workspace/read-model/scanners/canonical-extensions.js +237 -0
  173. package/dist/src/workspace/read-model/scanners/fs-helpers.d.ts +63 -0
  174. package/dist/src/workspace/read-model/scanners/fs-helpers.js +106 -0
  175. package/dist/src/workspace/read-model/scanners/index.d.ts +15 -0
  176. package/dist/src/workspace/read-model/scanners/index.js +34 -0
  177. package/dist/src/workspace/read-model/scanners/mcp-config.d.ts +47 -0
  178. package/dist/src/workspace/read-model/scanners/mcp-config.js +212 -0
  179. package/dist/src/workspace/read-model/scanners/types.d.ts +170 -0
  180. package/dist/src/workspace/read-model/scanners/types.js +86 -0
  181. package/dist/src/workspace/read-model/service.d.ts +103 -0
  182. package/dist/src/workspace/read-model/service.js +391 -0
  183. package/dist/src/workspace/read-model/state.d.ts +35 -0
  184. package/dist/src/workspace/read-model/state.js +97 -0
  185. package/dist/src/workspace/read-model/types.d.ts +75 -0
  186. package/dist/src/workspace/read-model/types.js +26 -0
  187. package/dist/src/workspace/read-model-record-readers.d.ts +34 -0
  188. package/dist/src/workspace/read-model-record-readers.js +467 -0
  189. package/dist/src/workspace/read-model-record-rows.d.ts +45 -0
  190. package/dist/src/workspace/read-model-record-rows.js +33 -0
  191. package/dist/src/workspace/read-model-record-types.d.ts +45 -0
  192. package/dist/src/workspace/read-model-record-types.js +13 -0
  193. package/dist/src/workspace/remove-if-exists.d.ts +13 -0
  194. package/dist/src/workspace/remove-if-exists.js +26 -0
  195. package/dist/src/workspace/rendered-files.d.ts +53 -0
  196. package/dist/src/workspace/rendered-files.js +50 -0
  197. package/dist/src/workspace/scope-refusal.d.ts +26 -0
  198. package/dist/src/workspace/scope-refusal.js +29 -0
  199. package/dist/src/workspace/service-interface.d.ts +479 -0
  200. package/dist/src/workspace/service-interface.js +27 -0
  201. package/dist/src/workspace/service.d.ts +1665 -0
  202. package/dist/src/workspace/service.js +1263 -0
  203. package/dist/src/workspace/setup-scope-support.d.ts +27 -0
  204. package/dist/src/workspace/setup-scope-support.js +299 -0
  205. package/dist/src/workspace/skill-paths.d.ts +33 -0
  206. package/dist/src/workspace/skill-paths.js +14 -0
  207. package/dist/src/workspace/source-metadata.d.ts +7 -0
  208. package/dist/src/workspace/source-metadata.js +10 -0
  209. package/dist/src/workspace/source-to-lock-entry.d.ts +32 -0
  210. package/dist/src/workspace/source-to-lock-entry.js +68 -0
  211. package/dist/src/workspace/test-stubs.d.ts +144 -0
  212. package/dist/src/workspace/test-stubs.js +412 -0
  213. package/dist/src/workspace/transaction.d.ts +218 -0
  214. package/dist/src/workspace/transaction.js +177 -0
  215. package/package.json +57 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Hook subject module: declared/resolved/actual payloads, scanner composition,
3
+ * and projections via the shared helper.
4
+ *
5
+ * Declared hooks come from `settings.hooks`; resolved hooks come from
6
+ * `axm-lock.yaml` `hooks`. Actual occurrences come exclusively from the
7
+ * canonical-extensions scanner (`type === "hook"`), which enumerates
8
+ * project-authored `hooks/<name>/src`, project-acquired
9
+ * `agent_extensions/<source>/<source-full-name>`, and user-scope packages.
10
+ *
11
+ * The hook installer also writes agent-side derived artifacts — managed hook
12
+ * groups inside agent settings files and the advisory-rule fallback region.
13
+ * Those are renderings of an installed hook, not separate materializations, so
14
+ * they are deliberately NOT occurrences: the family derives `actual` from the
15
+ * canonical scanner alone and an agent-side rendering never produces an
16
+ * unmanaged row.
17
+ */
18
+ import * as Effect from "effect/Effect";
19
+ import * as Option from "effect/Option";
20
+ import { decodeExtensionNameSync, } from "@agentxm/extension-model/unstable/extensions/common";
21
+ import { filterMapOccurrences } from "./actual-helpers.js";
22
+ import { canonicalAxmPackageRoot } from "./package-root.js";
23
+ import { makeProjectedSubjectCells, projectInstalledExtensions, } from "./projection.js";
24
+ // ---------------------------------------------------------------------------
25
+ // Helpers
26
+ // ---------------------------------------------------------------------------
27
+ const canonicalToActual = (occ, scope) => {
28
+ const isExternal = occ.origin === "external-axm";
29
+ const packageRoot = canonicalAxmPackageRoot(occ);
30
+ return {
31
+ key: { scope, type: "hook", name: occ.name },
32
+ origin: isExternal ? { _tag: "external-axm-hook" } : { _tag: "canonical-axm-hook" },
33
+ contentRoot: occ.contentLocation,
34
+ packageRoot,
35
+ };
36
+ };
37
+ const declaredFromSettings = (settings) => {
38
+ if (settings.hooks === undefined)
39
+ return [];
40
+ return Object.entries(settings.hooks).map(([name, entry]) => ({
41
+ name: decodeExtensionNameSync(name),
42
+ entry,
43
+ }));
44
+ };
45
+ const resolvedFromLockfile = (lockfile) => {
46
+ if (lockfile.hooks === undefined)
47
+ return [];
48
+ return Object.entries(lockfile.hooks).map(([name, lockEntry]) => ({
49
+ name: decodeExtensionNameSync(name),
50
+ lockEntry,
51
+ }));
52
+ };
53
+ const orphanResolvedWarning = (name) => ({
54
+ source: "lockfile",
55
+ message: `hook: lockfile entry "${name}" has no matching declared or pack-member home`,
56
+ code: "orphan-resolved",
57
+ });
58
+ const hookPolicy = (scope) => ({
59
+ declaredEntries: (d) => d,
60
+ declaredName: (entry) => entry.name,
61
+ declaredActivation: (entry) => (entry.entry.enabled === false ? "disabled" : "enabled"),
62
+ resolvedEntries: (r) => r,
63
+ resolvedName: (entry) => entry.name,
64
+ actualEntries: (a) => a,
65
+ actualName: (e) => e.key.name,
66
+ packMemberName: (m) => m.name,
67
+ packMemberActivation: () => "enabled",
68
+ attachActualToInstalled: (name, actual) => actual.filter((a) => a.key.name === name),
69
+ notClaimedBySubjectPolicy: () => true,
70
+ buildInstalledRow: (input) => ({
71
+ key: { scope, type: "hook", name: input.name },
72
+ installationOrigin: input.installationOrigin,
73
+ activation: input.activation,
74
+ resolved: input.resolved,
75
+ actual: input.actual,
76
+ providingPacks: input.providingPacks,
77
+ }),
78
+ buildUnmanagedRow: (entry) => ({
79
+ key: { scope, type: "hook", name: entry.key.name },
80
+ actual: entry,
81
+ }),
82
+ resolvedOrphanWarning: orphanResolvedWarning,
83
+ });
84
+ /**
85
+ * Build the hook subject API. Returns an `Effect` because the projection
86
+ * cell is wrapped in `Effect.cached` so the four derived cells share one
87
+ * in-flight execution per scope, mirroring `state.ts`.
88
+ */
89
+ export const makeHookExtensionsApi = (deps) => Effect.gen(function* () {
90
+ const { scope, scanners, diagnostics } = deps;
91
+ const declared = deps.loaders.settings.pipe(Effect.map((opt) => Option.map(opt, declaredFromSettings)));
92
+ const resolved = deps.loaders.lockfile.pipe(Effect.map((opt) => Option.map(opt, resolvedFromLockfile)));
93
+ const actual = Effect.gen(function* () {
94
+ const canonical = yield* scanners.canonical;
95
+ return filterMapOccurrences(canonical, "hook", (occ) => canonicalToActual(occ, scope));
96
+ });
97
+ const project = yield* Effect.cached(projectInstalledExtensions({
98
+ declared,
99
+ resolved,
100
+ actual,
101
+ installedPacks: deps.installedPacks,
102
+ packMembers: (pack) => pack.hooks,
103
+ packRef: (pack) => pack.ref,
104
+ policy: hookPolicy(scope),
105
+ diagnostics,
106
+ }));
107
+ return {
108
+ ...makeProjectedSubjectCells({
109
+ declared,
110
+ resolved,
111
+ actual,
112
+ project,
113
+ }),
114
+ declared,
115
+ resolved,
116
+ actual,
117
+ };
118
+ });
119
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Subject-module barrel: re-exports every per-subject API factory and its
3
+ * public payload types from one entry point so `context.ts` and downstream
4
+ * consumers can import a single module per concern instead of seven.
5
+ *
6
+ * Each subject module owns its own row shapes, scanner-composition signature,
7
+ * and projection wiring; this barrel only re-exports — no logic.
8
+ */
9
+ export { makeSkillExtensionsApi, type ActualSkill, type ActualSkills, type DeclaredSkill, type DeclaredSkills, type InstalledPackForSkills, type InstalledSkill, type ResolvedSkill, type ResolvedSkills, type SkillDetectionOrigin, type SkillExtensionsApi, type SkillExtensionsApiDeps, type SkillPackMember, type SkillScanners, type SkillScopedLoaders, type UnmanagedSkill, } from "./skill.js";
10
+ export { makeMcpServerExtensionsApi, type ActualMcpServer, type ActualMcpServers, type DeclaredMcpServer, type DeclaredMcpServers, type InstalledMcpServer, type InstalledPackForMcpServers, type McpServerDetectionOrigin, type McpServerExtensionsApi, type McpServerExtensionsApiDeps, type McpServerPackMember, type McpServerScanners, type McpServerScopedLoaders, type ResolvedMcpServer, type ResolvedMcpServers, type UnmanagedMcpServer, } from "./mcp-server.js";
11
+ export { makeSubagentExtensionsApi, type ActualSubagent, type ActualSubagents, type DeclaredSubagent, type DeclaredSubagents, type InstalledPackForSubagents, type InstalledSubagent, type ResolvedSubagent, type ResolvedSubagents, type SubagentDetectionOrigin, type SubagentExtensionsApi, type SubagentExtensionsApiDeps, type SubagentPackMember, type SubagentScanners, type SubagentScopedLoaders, type UnmanagedSubagent, } from "./subagent.js";
12
+ export { makeHookExtensionsApi, type ActualHook, type ActualHooks, type DeclaredHook, type DeclaredHooks, type HookDetectionOrigin, type HookExtensionsApi, type HookExtensionsApiDeps, type HookPackMember, type HookScanners, type HookScopedLoaders, type InstalledHook, type InstalledPackForHooks, type ResolvedHook, type ResolvedHooks, type UnmanagedHook, } from "./hook.js";
13
+ export { makeKnowledgeExtensionsApi, type ActualKnowledge, type ActualKnowledgeBundle, type DeclaredKnowledge, type DeclaredKnowledgeBundle, type InstalledKnowledgeBundle, type InstalledPackForKnowledge, type KnowledgeDetectionOrigin, type KnowledgeExtensionsApi, type KnowledgeExtensionsApiDeps, type KnowledgePackMember, type KnowledgeScanners, type KnowledgeScopedLoaders, type ResolvedKnowledge, type ResolvedKnowledgeBundle, type UnmanagedKnowledgeBundle, } from "./knowledge.js";
14
+ export { makeRuleExtensionsApi, type ActualRule, type ActualRules, type DeclaredRule, type DeclaredRules, type InstalledPackForRules, type InstalledRule, type ResolvedRule, type ResolvedRules, type RuleDetectionOrigin, type RuleExtensionsApi, type RuleExtensionsApiDeps, type RulePackMember, type RuleScanners, type RuleScopedLoaders, type UnmanagedRule, } from "./rule.js";
15
+ export { makePackExtensionsApi, type ActualPack, type ActualPacks, type DeclaredPack, type DeclaredPacks, type InstalledPack, type PackDetectionOrigin, type PackExtensionsApi, type PackExtensionsApiDeps, type PackPackMember, type PackScanners, type PackScopedLoaders, type ResolvedPack, type ResolvedPacks, type UnmanagedPack, } from "./pack.js";
16
+ export { projectInstalledExtensions, type BuildInstalledRowInput, type ProjectInstalledExtensionsInput, type ProjectInstalledExtensionsOutput, type SubjectPolicy, type TActualEntry, type TDeclaredEntry, type TResolvedEntry, } from "./projection.js";
17
+ export { findByName, indexByName, type RowWithKey } from "./indexByName.js";
18
+ export { ExtensionInventoryClassificationSchema, ExtensionInventoryLifecycleSchema, ExtensionInventoryRowSchema, ExtensionInventorySchema, projectExtensionInventory, type ExtensionInventory, type ExtensionInventoryClassification, type ExtensionInventoryLifecycle, type ExtensionInventoryObservation, type ExtensionInventoryRow, type LifecycleInventoryCandidate, type ProjectExtensionInventoryInput, } from "./inventory.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Subject-module barrel: re-exports every per-subject API factory and its
3
+ * public payload types from one entry point so `context.ts` and downstream
4
+ * consumers can import a single module per concern instead of seven.
5
+ *
6
+ * Each subject module owns its own row shapes, scanner-composition signature,
7
+ * and projection wiring; this barrel only re-exports — no logic.
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Skill subject
11
+ // ---------------------------------------------------------------------------
12
+ export { makeSkillExtensionsApi, } from "./skill.js";
13
+ // ---------------------------------------------------------------------------
14
+ // MCP server subject
15
+ // ---------------------------------------------------------------------------
16
+ export { makeMcpServerExtensionsApi, } from "./mcp-server.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Subagent subject
19
+ // ---------------------------------------------------------------------------
20
+ export { makeSubagentExtensionsApi, } from "./subagent.js";
21
+ // ---------------------------------------------------------------------------
22
+ // Hook subject
23
+ // ---------------------------------------------------------------------------
24
+ export { makeHookExtensionsApi, } from "./hook.js";
25
+ // ---------------------------------------------------------------------------
26
+ // Knowledge subject
27
+ // ---------------------------------------------------------------------------
28
+ export { makeKnowledgeExtensionsApi, } from "./knowledge.js";
29
+ // ---------------------------------------------------------------------------
30
+ // Rule subject
31
+ // ---------------------------------------------------------------------------
32
+ export { makeRuleExtensionsApi, } from "./rule.js";
33
+ // ---------------------------------------------------------------------------
34
+ // Pack subject
35
+ // ---------------------------------------------------------------------------
36
+ export { makePackExtensionsApi, } from "./pack.js";
37
+ // ---------------------------------------------------------------------------
38
+ // Shared projection helper + name-index helpers
39
+ // ---------------------------------------------------------------------------
40
+ export { projectInstalledExtensions, } from "./projection.js";
41
+ export { findByName, indexByName } from "./indexByName.js";
42
+ export { ExtensionInventoryClassificationSchema, ExtensionInventoryLifecycleSchema, ExtensionInventoryRowSchema, ExtensionInventorySchema, projectExtensionInventory, } from "./inventory.js";
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Pure `indexByName` / `findByName` helpers for projection rows carrying an
3
+ * `ExtensionKey`. Exported once from this shared utility; per-subject modules
4
+ * re-use the same shape so command handlers can lookup a row by name without
5
+ * each subject re-implementing the operation.
6
+ *
7
+ * Rows are read-only inputs; the helpers do not mutate or copy beyond what is
8
+ * needed to build a `Map`. First-seen wins on duplicate names — duplicates are
9
+ * rare in projection output (the projection helper deduplicates by name) but
10
+ * the contract is explicit.
11
+ */
12
+ import * as Option from "effect/Option";
13
+ import type { ExtensionKey } from "../types.js";
14
+ /**
15
+ * Minimal row shape the helpers operate on. Subjects whose row carries
16
+ * `key: ExtensionKey<TType>` for any `TType` satisfies this constraint.
17
+ */
18
+ export interface RowWithKey {
19
+ readonly key: ExtensionKey;
20
+ }
21
+ /**
22
+ * Build a name-indexed read-only map from a row array. First row with a given
23
+ * `key.name` wins; subsequent rows with the same name are dropped.
24
+ */
25
+ export declare const indexByName: <Row extends RowWithKey>(rows: ReadonlyArray<Row>) => ReadonlyMap<string, Row>;
26
+ /**
27
+ * Look up one row by name. Returns `Option.none()` when the name is not
28
+ * indexed.
29
+ */
30
+ export declare const findByName: <Row extends RowWithKey>(rows: ReadonlyArray<Row>, name: string) => Option.Option<Row>;
31
+ //# sourceMappingURL=indexByName.d.ts.map
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Pure `indexByName` / `findByName` helpers for projection rows carrying an
3
+ * `ExtensionKey`. Exported once from this shared utility; per-subject modules
4
+ * re-use the same shape so command handlers can lookup a row by name without
5
+ * each subject re-implementing the operation.
6
+ *
7
+ * Rows are read-only inputs; the helpers do not mutate or copy beyond what is
8
+ * needed to build a `Map`. First-seen wins on duplicate names — duplicates are
9
+ * rare in projection output (the projection helper deduplicates by name) but
10
+ * the contract is explicit.
11
+ */
12
+ import * as Option from "effect/Option";
13
+ /**
14
+ * Build a name-indexed read-only map from a row array. First row with a given
15
+ * `key.name` wins; subsequent rows with the same name are dropped.
16
+ */
17
+ export const indexByName = (rows) => {
18
+ const map = new Map();
19
+ for (const row of rows) {
20
+ if (!map.has(row.key.name))
21
+ map.set(row.key.name, row);
22
+ }
23
+ return map;
24
+ };
25
+ /**
26
+ * Look up one row by name. Returns `Option.none()` when the name is not
27
+ * indexed.
28
+ */
29
+ export const findByName = (rows, name) => Option.fromUndefinedOr(indexByName(rows).get(name));
30
+ //# sourceMappingURL=indexByName.js.map
@@ -0,0 +1,99 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { type ConfiguredAgentOutcome } from "../../configured-agent-outcome.js";
3
+ import type { ExtensionKey } from "../types.js";
4
+ export declare const ExtensionInventoryLifecycleSchema: Schema.Literals<readonly ["configured", "implicit", "unmanaged"]>;
5
+ export type ExtensionInventoryLifecycle = typeof ExtensionInventoryLifecycleSchema.Type;
6
+ export declare const ExtensionInventoryClassificationSchema: Schema.Struct<{
7
+ readonly kind: Schema.Literal<"lifecycle">;
8
+ readonly lifecycle: Schema.Literals<readonly ["configured", "implicit", "unmanaged"]>;
9
+ }>;
10
+ export type ExtensionInventoryClassification = typeof ExtensionInventoryClassificationSchema.Type;
11
+ export declare const ExtensionInventoryRowSchema: Schema.Struct<{
12
+ readonly scope: Schema.Literals<readonly ["project", "user"]>;
13
+ readonly type: Schema.Literals<readonly ("skill" | "mcp-server" | "subagent" | "rule" | "hook" | "knowledge" | "pack")[]>;
14
+ readonly name: Schema.String;
15
+ readonly classification: Schema.Struct<{
16
+ readonly kind: Schema.Literal<"lifecycle">;
17
+ readonly lifecycle: Schema.Literals<readonly ["configured", "implicit", "unmanaged"]>;
18
+ }>;
19
+ readonly enabled: Schema.NullOr<Schema.Boolean>;
20
+ readonly installed: Schema.Boolean;
21
+ readonly agents: Schema.$Array<Schema.String>;
22
+ readonly agentOutcomes: Schema.$Array<Schema.Struct<{
23
+ readonly extensionType: Schema.Literals<readonly ("skill" | "mcp-server" | "subagent" | "rule" | "hook" | "knowledge" | "pack")[]>;
24
+ readonly name: Schema.String;
25
+ readonly agentId: Schema.String;
26
+ readonly outcome: Schema.Literals<readonly ["projected", "current", "not-applicable", "unsupported", "blocked", "failed"]>;
27
+ readonly reasonCode: Schema.String;
28
+ readonly reason: Schema.String;
29
+ readonly mechanism: Schema.optional<Schema.String>;
30
+ readonly path: Schema.optional<Schema.String>;
31
+ }>>;
32
+ readonly origins: Schema.$Array<Schema.String>;
33
+ readonly paths: Schema.$Array<Schema.String>;
34
+ readonly source: Schema.optionalKey<Schema.String>;
35
+ readonly version: Schema.optionalKey<Schema.String>;
36
+ readonly owner: Schema.optionalKey<Schema.String>;
37
+ readonly transport: Schema.optionalKey<Schema.String>;
38
+ readonly status: Schema.optionalKey<Schema.String>;
39
+ readonly locked: Schema.optionalKey<Schema.Boolean>;
40
+ readonly sourceType: Schema.optionalKey<Schema.String>;
41
+ }>;
42
+ export type ExtensionInventoryRow = typeof ExtensionInventoryRowSchema.Type;
43
+ export declare const ExtensionInventorySchema: Schema.Struct<{
44
+ readonly items: Schema.$Array<Schema.Struct<{
45
+ readonly scope: Schema.Literals<readonly ["project", "user"]>;
46
+ readonly type: Schema.Literals<readonly ("skill" | "mcp-server" | "subagent" | "rule" | "hook" | "knowledge" | "pack")[]>;
47
+ readonly name: Schema.String;
48
+ readonly classification: Schema.Struct<{
49
+ readonly kind: Schema.Literal<"lifecycle">;
50
+ readonly lifecycle: Schema.Literals<readonly ["configured", "implicit", "unmanaged"]>;
51
+ }>;
52
+ readonly enabled: Schema.NullOr<Schema.Boolean>;
53
+ readonly installed: Schema.Boolean;
54
+ readonly agents: Schema.$Array<Schema.String>;
55
+ readonly agentOutcomes: Schema.$Array<Schema.Struct<{
56
+ readonly extensionType: Schema.Literals<readonly ("skill" | "mcp-server" | "subagent" | "rule" | "hook" | "knowledge" | "pack")[]>;
57
+ readonly name: Schema.String;
58
+ readonly agentId: Schema.String;
59
+ readonly outcome: Schema.Literals<readonly ["projected", "current", "not-applicable", "unsupported", "blocked", "failed"]>;
60
+ readonly reasonCode: Schema.String;
61
+ readonly reason: Schema.String;
62
+ readonly mechanism: Schema.optional<Schema.String>;
63
+ readonly path: Schema.optional<Schema.String>;
64
+ }>>;
65
+ readonly origins: Schema.$Array<Schema.String>;
66
+ readonly paths: Schema.$Array<Schema.String>;
67
+ readonly source: Schema.optionalKey<Schema.String>;
68
+ readonly version: Schema.optionalKey<Schema.String>;
69
+ readonly owner: Schema.optionalKey<Schema.String>;
70
+ readonly transport: Schema.optionalKey<Schema.String>;
71
+ readonly status: Schema.optionalKey<Schema.String>;
72
+ readonly locked: Schema.optionalKey<Schema.Boolean>;
73
+ readonly sourceType: Schema.optionalKey<Schema.String>;
74
+ }>>;
75
+ readonly count: Schema.Number;
76
+ readonly configuredCount: Schema.Number;
77
+ readonly implicitCount: Schema.Number;
78
+ readonly installedCount: Schema.Number;
79
+ readonly unmanagedCount: Schema.Number;
80
+ }>;
81
+ export type ExtensionInventory = typeof ExtensionInventorySchema.Type;
82
+ export interface ExtensionInventoryObservation {
83
+ readonly agents?: ReadonlyArray<string>;
84
+ readonly origins?: ReadonlyArray<string>;
85
+ readonly paths?: ReadonlyArray<string>;
86
+ }
87
+ export interface LifecycleInventoryCandidate extends ExtensionInventoryObservation {
88
+ readonly key: ExtensionKey;
89
+ readonly lifecycle: ExtensionInventoryLifecycle;
90
+ readonly enabled: boolean | null;
91
+ readonly installed: boolean;
92
+ readonly agentOutcomes?: ReadonlyArray<ConfiguredAgentOutcome>;
93
+ }
94
+ export interface ProjectExtensionInventoryInput {
95
+ readonly lifecycle: ReadonlyArray<LifecycleInventoryCandidate>;
96
+ readonly agents?: ReadonlyArray<string>;
97
+ }
98
+ export declare const projectExtensionInventory: (input: ProjectExtensionInventoryInput) => ExtensionInventory;
99
+ //# sourceMappingURL=inventory.d.ts.map
@@ -0,0 +1,111 @@
1
+ import * as Schema from "effect/Schema";
2
+ import { ExtensionTypeSchema } from "@agentxm/extension-model/unstable/extensions/common";
3
+ import { ConfiguredAgentOutcomeSchema, } from "../../configured-agent-outcome.js";
4
+ export const ExtensionInventoryLifecycleSchema = Schema.Literals([
5
+ "configured",
6
+ "implicit",
7
+ "unmanaged",
8
+ ]);
9
+ export const ExtensionInventoryClassificationSchema = Schema.Struct({
10
+ kind: Schema.Literal("lifecycle"),
11
+ lifecycle: ExtensionInventoryLifecycleSchema,
12
+ });
13
+ export const ExtensionInventoryRowSchema = Schema.Struct({
14
+ scope: Schema.Literals(["project", "user"]),
15
+ type: ExtensionTypeSchema,
16
+ name: Schema.String,
17
+ classification: ExtensionInventoryClassificationSchema,
18
+ enabled: Schema.NullOr(Schema.Boolean),
19
+ installed: Schema.Boolean,
20
+ agents: Schema.Array(Schema.String),
21
+ agentOutcomes: Schema.Array(ConfiguredAgentOutcomeSchema),
22
+ origins: Schema.Array(Schema.String),
23
+ paths: Schema.Array(Schema.String),
24
+ source: Schema.optionalKey(Schema.String),
25
+ version: Schema.optionalKey(Schema.String),
26
+ owner: Schema.optionalKey(Schema.String),
27
+ transport: Schema.optionalKey(Schema.String),
28
+ status: Schema.optionalKey(Schema.String),
29
+ locked: Schema.optionalKey(Schema.Boolean),
30
+ sourceType: Schema.optionalKey(Schema.String),
31
+ });
32
+ export const ExtensionInventorySchema = Schema.Struct({
33
+ items: Schema.Array(ExtensionInventoryRowSchema),
34
+ count: Schema.Number,
35
+ configuredCount: Schema.Number,
36
+ implicitCount: Schema.Number,
37
+ installedCount: Schema.Number,
38
+ unmanagedCount: Schema.Number,
39
+ });
40
+ const lifecyclePriority = {
41
+ configured: 0,
42
+ implicit: 1,
43
+ unmanaged: 2,
44
+ };
45
+ const keyString = (key) => `${key.scope}:${key.type}:${key.name}`;
46
+ const addAll = (target, values) => {
47
+ for (const value of values ?? [])
48
+ target.add(value);
49
+ };
50
+ const sorted = (values) => Array.from(values).sort((left, right) => left.localeCompare(right));
51
+ const matchesAgentFilter = (agents, filter) => filter.length === 0 || filter.some((agent) => agents.includes(agent));
52
+ export const projectExtensionInventory = (input) => {
53
+ const lifecycleByKey = new Map();
54
+ for (const candidate of input.lifecycle) {
55
+ const candidateKey = keyString(candidate.key);
56
+ const existing = lifecycleByKey.get(candidateKey);
57
+ if (existing === undefined) {
58
+ const aggregate = {
59
+ key: candidate.key,
60
+ lifecycle: candidate.lifecycle,
61
+ enabled: candidate.enabled,
62
+ installed: candidate.installed,
63
+ agents: new Set(candidate.agents ?? []),
64
+ agentOutcomes: new Map((candidate.agentOutcomes ?? []).map((outcome) => [outcome.agentId, outcome])),
65
+ origins: new Set(candidate.origins ?? []),
66
+ paths: new Set(candidate.paths ?? []),
67
+ };
68
+ lifecycleByKey.set(candidateKey, aggregate);
69
+ continue;
70
+ }
71
+ if (lifecyclePriority[candidate.lifecycle] < lifecyclePriority[existing.lifecycle]) {
72
+ existing.lifecycle = candidate.lifecycle;
73
+ existing.enabled = candidate.enabled;
74
+ }
75
+ existing.installed = existing.installed || candidate.installed;
76
+ addAll(existing.agents, candidate.agents);
77
+ for (const outcome of candidate.agentOutcomes ?? []) {
78
+ existing.agentOutcomes.set(outcome.agentId, outcome);
79
+ }
80
+ addAll(existing.origins, candidate.origins);
81
+ addAll(existing.paths, candidate.paths);
82
+ }
83
+ const agentFilter = input.agents ?? [];
84
+ const lifecycleRows = Array.from(lifecycleByKey.entries())
85
+ .filter(([, aggregate]) => matchesAgentFilter(sorted(aggregate.agents), agentFilter))
86
+ .map(([, aggregate]) => ({
87
+ scope: aggregate.key.scope,
88
+ type: aggregate.key.type,
89
+ name: aggregate.key.name,
90
+ classification: { kind: "lifecycle", lifecycle: aggregate.lifecycle },
91
+ enabled: aggregate.enabled,
92
+ installed: aggregate.installed,
93
+ agents: sorted(aggregate.agents),
94
+ agentOutcomes: Array.from(aggregate.agentOutcomes.values()).sort((left, right) => left.agentId.localeCompare(right.agentId)),
95
+ origins: sorted(aggregate.origins),
96
+ paths: sorted(aggregate.paths),
97
+ }));
98
+ const items = lifecycleRows.sort((left, right) => left.name.localeCompare(right.name));
99
+ const configuredCount = items.filter((item) => item.classification.lifecycle === "configured").length;
100
+ const implicitCount = items.filter((item) => item.classification.lifecycle === "implicit").length;
101
+ const unmanagedCount = items.filter((item) => item.classification.lifecycle === "unmanaged").length;
102
+ return {
103
+ items,
104
+ count: items.length,
105
+ configuredCount,
106
+ implicitCount,
107
+ installedCount: items.filter((item) => item.installed).length,
108
+ unmanagedCount,
109
+ };
110
+ };
111
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Knowledge subject module: declared/resolved/actual payloads, scanner
3
+ * composition, and projections via the shared helper.
4
+ *
5
+ * Declared bundles come from `settings.knowledge`; resolved bundles come from
6
+ * `axm-lock.yaml` `knowledge`. Actual occurrences come exclusively from the
7
+ * canonical-extensions scanner (`type === "knowledge"`), which enumerates
8
+ * project-authored `knowledge/<name>/src`, project-acquired
9
+ * `agent_extensions/<source>/<source-full-name>`, and user-scope packages.
10
+ *
11
+ * Knowledge installs also write two derived artifacts — the `.axm/knowledge/index.md`
12
+ * catalog and the discovery region inside the agent instructions file. Both live
13
+ * outside canonical package roots, so the canonical scanner never sees them and they
14
+ * cannot become occurrences; `actual` is therefore scoped to the materialized
15
+ * bundle package directory by construction.
16
+ *
17
+ * Pack-resolved Knowledge members participate in the same direct-over-pack
18
+ * projection as every other extension type.
19
+ */
20
+ import * as Effect from "effect/Effect";
21
+ import * as Option from "effect/Option";
22
+ import { type ExtensionName } from "@agentxm/extension-model/unstable/extensions/common";
23
+ import type { KnowledgeLockEntry, Lockfile } from "../../../lockfile/schema.js";
24
+ import type { KnowledgeEntry, Settings } from "../../../settings/schema.js";
25
+ import type { Diagnostics } from "../diagnostics.js";
26
+ import type { LockfileReadError, SettingsReadError } from "../errors.js";
27
+ import type { CanonicalExtensionOccurrence } from "../scanners/types.js";
28
+ import type { ActivationState, ExtensionKey, InstallationOrigin, InstalledPackRef, Scope } from "../types.js";
29
+ export type KnowledgeDetectionOrigin = {
30
+ readonly _tag: "canonical-axm-knowledge";
31
+ } | {
32
+ readonly _tag: "external-axm-knowledge";
33
+ };
34
+ export interface DeclaredKnowledgeBundle {
35
+ readonly name: ExtensionName;
36
+ readonly entry: KnowledgeEntry;
37
+ }
38
+ export type DeclaredKnowledge = ReadonlyArray<DeclaredKnowledgeBundle>;
39
+ export interface ResolvedKnowledgeBundle {
40
+ readonly name: ExtensionName;
41
+ readonly lockEntry: KnowledgeLockEntry;
42
+ }
43
+ export type ResolvedKnowledge = ReadonlyArray<ResolvedKnowledgeBundle>;
44
+ export interface ActualKnowledgeBundle {
45
+ readonly key: ExtensionKey<"knowledge">;
46
+ readonly origin: KnowledgeDetectionOrigin;
47
+ readonly contentRoot: string;
48
+ readonly packageRoot: string | null;
49
+ }
50
+ export type ActualKnowledge = ReadonlyArray<ActualKnowledgeBundle>;
51
+ export interface KnowledgePackMember {
52
+ readonly name: ExtensionName;
53
+ readonly providingPack: InstalledPackRef;
54
+ }
55
+ export interface InstalledKnowledgeBundle {
56
+ readonly key: ExtensionKey<"knowledge">;
57
+ readonly installationOrigin: InstallationOrigin<DeclaredKnowledgeBundle, KnowledgePackMember>;
58
+ readonly activation: ActivationState;
59
+ readonly resolved: Option.Option<ResolvedKnowledgeBundle>;
60
+ readonly actual: ReadonlyArray<ActualKnowledgeBundle>;
61
+ readonly providingPacks: ReadonlyArray<InstalledPackRef>;
62
+ }
63
+ export interface UnmanagedKnowledgeBundle {
64
+ readonly key: ExtensionKey<"knowledge">;
65
+ readonly actual: ActualKnowledgeBundle;
66
+ }
67
+ export interface KnowledgeScanners {
68
+ readonly canonical: Effect.Effect<ReadonlyArray<CanonicalExtensionOccurrence>>;
69
+ }
70
+ export interface KnowledgeScopedLoaders {
71
+ readonly settings: Effect.Effect<Option.Option<Settings>, SettingsReadError>;
72
+ readonly lockfile: Effect.Effect<Option.Option<Lockfile>, LockfileReadError>;
73
+ }
74
+ export interface KnowledgeExtensionsApiDeps {
75
+ readonly scope: Scope;
76
+ readonly loaders: KnowledgeScopedLoaders;
77
+ readonly scanners: KnowledgeScanners;
78
+ readonly installedPacks: Effect.Effect<ReadonlyArray<InstalledPackForKnowledge>, SettingsReadError | LockfileReadError>;
79
+ readonly diagnostics: Diagnostics;
80
+ }
81
+ export interface InstalledPackForKnowledge {
82
+ readonly ref: InstalledPackRef;
83
+ readonly knowledge: ReadonlyArray<KnowledgePackMember>;
84
+ }
85
+ export interface KnowledgeExtensionsApi {
86
+ readonly declared: Effect.Effect<Option.Option<DeclaredKnowledge>, SettingsReadError>;
87
+ readonly resolved: Effect.Effect<Option.Option<ResolvedKnowledge>, LockfileReadError>;
88
+ readonly actual: Effect.Effect<ActualKnowledge>;
89
+ readonly installed: Effect.Effect<ReadonlyArray<InstalledKnowledgeBundle>, SettingsReadError | LockfileReadError>;
90
+ readonly byName: (name: string) => Effect.Effect<Option.Option<InstalledKnowledgeBundle>, SettingsReadError | LockfileReadError>;
91
+ readonly declaredByName: (name: string) => Effect.Effect<Option.Option<DeclaredKnowledgeBundle>, SettingsReadError>;
92
+ readonly active: Effect.Effect<ReadonlyArray<InstalledKnowledgeBundle>, SettingsReadError | LockfileReadError>;
93
+ readonly unmanaged: Effect.Effect<ReadonlyArray<UnmanagedKnowledgeBundle>, SettingsReadError | LockfileReadError>;
94
+ }
95
+ /**
96
+ * Build the knowledge subject API. Returns an `Effect` because the projection
97
+ * cell is wrapped in `Effect.cached` so the four derived cells share one
98
+ * in-flight execution per scope, mirroring `state.ts`.
99
+ */
100
+ export declare const makeKnowledgeExtensionsApi: (deps: KnowledgeExtensionsApiDeps) => Effect.Effect<KnowledgeExtensionsApi>;
101
+ //# sourceMappingURL=knowledge.d.ts.map