@adaptabletools/adaptable-mcp 0.1.0-canary.0 → 0.1.0-canary.1

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 (105) hide show
  1. package/README.md +56 -61
  2. package/data/manifest.snapshot.json +184 -0
  3. package/dist/bin.js +16 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/cli/build-commands.js +200 -0
  6. package/dist/cli/build-commands.js.map +1 -0
  7. package/dist/cli/index.js +86 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/render.js +57 -0
  10. package/dist/cli/render.js.map +1 -0
  11. package/dist/core/capabilities.js +99 -0
  12. package/dist/core/capabilities.js.map +1 -0
  13. package/dist/core/compat/capabilities.js +127 -0
  14. package/dist/core/compat/capabilities.js.map +1 -0
  15. package/dist/core/compat/manifest.js +203 -0
  16. package/dist/core/compat/manifest.js.map +1 -0
  17. package/dist/core/constants.js +38 -0
  18. package/dist/core/constants.js.map +1 -0
  19. package/dist/core/context/capabilities.js +106 -0
  20. package/dist/core/context/capabilities.js.map +1 -0
  21. package/dist/core/context/detect.js +370 -0
  22. package/dist/core/context/detect.js.map +1 -0
  23. package/dist/core/context/projects.js +159 -0
  24. package/dist/core/context/projects.js.map +1 -0
  25. package/dist/core/context/resolve.js +85 -0
  26. package/dist/core/context/resolve.js.map +1 -0
  27. package/dist/core/docs/areas.js +22 -0
  28. package/dist/core/docs/areas.js.map +1 -0
  29. package/dist/core/docs/cache.js +133 -0
  30. package/dist/core/docs/cache.js.map +1 -0
  31. package/dist/core/docs/capabilities.js +381 -0
  32. package/dist/core/docs/capabilities.js.map +1 -0
  33. package/dist/core/docs/corpus.js.map +1 -0
  34. package/dist/core/docs/demos.js +105 -0
  35. package/dist/core/docs/demos.js.map +1 -0
  36. package/dist/core/docs/get-page.js +182 -0
  37. package/dist/core/docs/get-page.js.map +1 -0
  38. package/dist/core/docs/hosts.js +74 -0
  39. package/dist/core/docs/hosts.js.map +1 -0
  40. package/dist/core/docs/search.js.map +1 -0
  41. package/dist/core/envelope.js +79 -0
  42. package/dist/core/envelope.js.map +1 -0
  43. package/dist/core/index.js +13 -0
  44. package/dist/core/index.js.map +1 -0
  45. package/dist/core/packages/cache.js +138 -0
  46. package/dist/core/packages/cache.js.map +1 -0
  47. package/dist/core/packages/capabilities.js +95 -0
  48. package/dist/core/packages/capabilities.js.map +1 -0
  49. package/dist/{adaptable/types.js → core/packages/entry-types.js} +1 -1
  50. package/dist/core/packages/entry-types.js.map +1 -0
  51. package/dist/core/packages/exec.js +37 -0
  52. package/dist/core/packages/exec.js.map +1 -0
  53. package/dist/core/packages/load-entry.js +123 -0
  54. package/dist/core/packages/load-entry.js.map +1 -0
  55. package/dist/core/packages/prepare.js +122 -0
  56. package/dist/core/packages/prepare.js.map +1 -0
  57. package/dist/core/packages/registry.js +75 -0
  58. package/dist/core/packages/registry.js.map +1 -0
  59. package/dist/core/packages/resolve.js +94 -0
  60. package/dist/core/packages/resolve.js.map +1 -0
  61. package/dist/core/packages/versions.js +71 -0
  62. package/dist/core/packages/versions.js.map +1 -0
  63. package/dist/core/ping.js +22 -0
  64. package/dist/core/ping.js.map +1 -0
  65. package/dist/core/register.js +10 -0
  66. package/dist/core/register.js.map +1 -0
  67. package/dist/{checks/stateRules.js → core/state/rules.js} +29 -1
  68. package/dist/core/state/rules.js.map +1 -0
  69. package/dist/{checks/stateTypes.js → core/state/type-check.js} +1 -1
  70. package/dist/core/state/type-check.js.map +1 -0
  71. package/dist/mcp/index.js +21 -0
  72. package/dist/mcp/index.js.map +1 -0
  73. package/package.json +27 -12
  74. package/dist/adaptable/loadEntry.js +0 -94
  75. package/dist/adaptable/loadEntry.js.map +0 -1
  76. package/dist/adaptable/types.js.map +0 -1
  77. package/dist/cache.js +0 -11
  78. package/dist/cache.js.map +0 -1
  79. package/dist/checks/stateRules.js.map +0 -1
  80. package/dist/checks/stateTypes.js.map +0 -1
  81. package/dist/context.js +0 -39
  82. package/dist/context.js.map +0 -1
  83. package/dist/docs/corpus.js.map +0 -1
  84. package/dist/docs/search.js.map +0 -1
  85. package/dist/docs/source.js +0 -151
  86. package/dist/docs/source.js.map +0 -1
  87. package/dist/environment.js +0 -181
  88. package/dist/environment.js.map +0 -1
  89. package/dist/index.js +0 -7
  90. package/dist/index.js.map +0 -1
  91. package/dist/prompts.js +0 -84
  92. package/dist/prompts.js.map +0 -1
  93. package/dist/resources.js +0 -59
  94. package/dist/resources.js.map +0 -1
  95. package/dist/server.js +0 -23
  96. package/dist/server.js.map +0 -1
  97. package/dist/tools/checks.js +0 -250
  98. package/dist/tools/checks.js.map +0 -1
  99. package/dist/tools/docs.js +0 -173
  100. package/dist/tools/docs.js.map +0 -1
  101. package/dist/tools/environment.js +0 -52
  102. package/dist/tools/environment.js.map +0 -1
  103. package/skills/adaptable-dev/SKILL.md +0 -42
  104. /package/dist/{docs → core/docs}/corpus.js +0 -0
  105. /package/dist/{docs → core/docs}/search.js +0 -0
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Project discovery for context resolution (plan §7.2, step 3): walk up from a
3
+ * folder to the nearest `package.json` that declares an `@adaptabletools/*`
4
+ * dependency, looking through npm/yarn workspaces on the way.
5
+ */
6
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
7
+ import { dirname, join, resolve } from 'node:path';
8
+ import { CLI_PACKAGE } from '../constants.js';
9
+ import { findInstalledPackageJson } from './detect.js';
10
+ const WRAPPERS = {
11
+ '@adaptabletools/adaptable-react-aggrid': 'react',
12
+ '@adaptabletools/adaptable-angular-aggrid': 'angular',
13
+ '@adaptabletools/adaptable-vue3-aggrid': 'vue',
14
+ };
15
+ const CORE_PACKAGE = '@adaptabletools/adaptable';
16
+ function readJson(path) {
17
+ try {
18
+ return JSON.parse(readFileSync(path, 'utf8'));
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ function declaredDependencies(pkg) {
25
+ return {
26
+ ...(pkg?.peerDependencies ?? {}),
27
+ ...(pkg?.devDependencies ?? {}),
28
+ ...(pkg?.dependencies ?? {}),
29
+ };
30
+ }
31
+ /** First major number in a version or range; undefined for `workspace:*`, `latest`, `file:` and the like */
32
+ export function majorOf(versionOrRange) {
33
+ const match = versionOrRange?.match(/(\d+)(?:\.\d+|\s|$|\.x|\.\*)/);
34
+ return match ? Number(match[1]) : undefined;
35
+ }
36
+ /** The project a package.json describes, or undefined when it does not depend on AdapTable */
37
+ export function projectFrom(dir, pkg, boundary) {
38
+ const deps = declaredDependencies(pkg);
39
+ const adaptableNames = Object.keys(deps).filter((n) => n.startsWith('@adaptabletools/') && n !== CLI_PACKAGE);
40
+ if (!adaptableNames.length) {
41
+ return undefined;
42
+ }
43
+ const wrapperName = adaptableNames.find((n) => WRAPPERS[n]);
44
+ const declared = (name) => ({
45
+ name,
46
+ range: deps[name],
47
+ installed: findInstalledPackageJson(dir, name, boundary)?.version,
48
+ });
49
+ const core = declared(CORE_PACKAGE);
50
+ const wrapper = wrapperName ? declared(wrapperName) : undefined;
51
+ // The wrapper pins the core version, so a project declaring only the wrapper still has one
52
+ const installed = core.installed ?? wrapper?.installed;
53
+ const range = core.range ?? wrapper?.range;
54
+ const adaptable = { ...core, range, installed, major: majorOf(installed ?? range) };
55
+ const agGridName = deps['ag-grid-enterprise']
56
+ ? 'ag-grid-enterprise'
57
+ : deps['ag-grid-community']
58
+ ? 'ag-grid-community'
59
+ : undefined;
60
+ const agGrid = agGridName
61
+ ? (() => {
62
+ const info = declared(agGridName);
63
+ return { ...info, major: majorOf(info.installed ?? info.range), enterprise: agGridName === 'ag-grid-enterprise' };
64
+ })()
65
+ : undefined;
66
+ return {
67
+ path: dir,
68
+ adaptable,
69
+ wrapper,
70
+ framework: wrapperName ? WRAPPERS[wrapperName] : 'vanilla',
71
+ agGrid,
72
+ };
73
+ }
74
+ function isDirectory(path) {
75
+ try {
76
+ return statSync(path).isDirectory();
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ function subdirectories(dir) {
83
+ try {
84
+ return readdirSync(dir, { withFileTypes: true })
85
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules')
86
+ .map((entry) => join(dir, entry.name));
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ }
92
+ /** Expands one workspace glob (`packages/*`, `apps/**`, `tools/cli`) to folders */
93
+ function expandGlob(dir, segments) {
94
+ if (!segments.length) {
95
+ return isDirectory(dir) ? [dir] : [];
96
+ }
97
+ const [segment, ...rest] = segments;
98
+ if (segment === '**') {
99
+ const deeper = subdirectories(dir).flatMap((sub) => expandGlob(sub, segments));
100
+ return [...expandGlob(dir, rest), ...deeper];
101
+ }
102
+ if (segment.includes('*')) {
103
+ const pattern = new RegExp(`^${segment.split('*').map(escapeRegExp).join('.*')}$`);
104
+ return subdirectories(dir)
105
+ .filter((sub) => pattern.test(sub.slice(dir.length + 1)))
106
+ .flatMap((sub) => expandGlob(sub, rest));
107
+ }
108
+ return expandGlob(join(dir, segment), rest);
109
+ }
110
+ const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
111
+ /** Folders listed by `workspaces` (array or `{ packages }`) of a root package.json */
112
+ export function workspaceDirectories(root, pkg) {
113
+ const patterns = Array.isArray(pkg?.workspaces) ? pkg.workspaces : pkg?.workspaces?.packages;
114
+ if (!Array.isArray(patterns)) {
115
+ return [];
116
+ }
117
+ const dirs = new Set();
118
+ for (const pattern of patterns) {
119
+ if (typeof pattern !== 'string' || pattern.startsWith('!')) {
120
+ continue;
121
+ }
122
+ for (const dir of expandGlob(root, pattern.split('/').filter(Boolean))) {
123
+ if (dir !== root && existsSync(join(dir, 'package.json'))) {
124
+ dirs.add(dir);
125
+ }
126
+ }
127
+ }
128
+ return [...dirs].sort();
129
+ }
130
+ /**
131
+ * Projects that depend on AdapTable, found by walking up from `start`: the first
132
+ * package.json that declares `@adaptabletools/*` wins; a workspace root that does
133
+ * not declare it itself contributes every member that does. Empty when none is found.
134
+ * `boundary` limits the `node_modules` lookup (see `walkUp`); tests only.
135
+ */
136
+ export function findProjects(start, boundary) {
137
+ let dir = resolve(start);
138
+ for (;;) {
139
+ const pkg = readJson(join(dir, 'package.json'));
140
+ if (pkg) {
141
+ const own = projectFrom(dir, pkg, boundary);
142
+ if (own) {
143
+ return [own];
144
+ }
145
+ const members = workspaceDirectories(dir, pkg)
146
+ .map((member) => projectFrom(member, readJson(join(member, 'package.json')), boundary))
147
+ .filter((project) => !!project);
148
+ if (members.length) {
149
+ return members;
150
+ }
151
+ }
152
+ const parent = dirname(dir);
153
+ if (parent === dir) {
154
+ return [];
155
+ }
156
+ dir = parent;
157
+ }
158
+ }
159
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/core/context/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Context resolution (plan §7.2). Precedence, first hit wins:
3
+ * 1. explicit `--major` / `--framework`
4
+ * 2. session pin — reserved for a future remote transport; never set by the CLI or the stdio server
5
+ * 3. detection — the nearest project declaring `@adaptabletools/*` (workspace-aware)
6
+ * 4. `latest` from the docs manifest (or the snapshot offline), with a mandatory warning
7
+ */
8
+ import { resolve as resolvePath } from 'node:path';
9
+ import { MIGRATION_FLOOR } from '../constants.js';
10
+ import { docsHostFor } from '../docs/hosts.js';
11
+ import { CapabilityError } from '../envelope.js';
12
+ import { findProjects } from './projects.js';
13
+ const docsHostInfo = (latest) => ({
14
+ latestMajor: latest?.adaptableMajor,
15
+ docsHosts: latest?.docsHosts,
16
+ });
17
+ /** A0.2 placeholder; A0.6 replaces it with the hosted-manifest / snapshot lookup. */
18
+ export const noLatest = async () => undefined;
19
+ function assertSupportedMajor(major) {
20
+ if (!Number.isInteger(major) || major < MIGRATION_FLOOR) {
21
+ throw new CapabilityError('VERSION_NOT_SUPPORTED', `AdapTable ${major} is not a supported major version.`, `Pass --major with a value of ${MIGRATION_FLOOR} or later.`);
22
+ }
23
+ }
24
+ export async function resolveContext(options, deps = {}) {
25
+ const cwd = resolvePath(options.cwd ?? process.cwd());
26
+ const warnings = [];
27
+ if (options.major !== undefined) {
28
+ assertSupportedMajor(options.major);
29
+ }
30
+ const projects = findProjects(cwd);
31
+ const project = projects.length === 1 ? projects[0] : undefined;
32
+ let source;
33
+ let major;
34
+ let version;
35
+ let latest;
36
+ if (options.major !== undefined) {
37
+ source = 'explicit';
38
+ major = options.major;
39
+ version = project?.adaptable.major === major ? project.adaptable.installed : undefined;
40
+ }
41
+ else if (deps.session) {
42
+ source = 'session';
43
+ major = deps.session.adaptableMajor;
44
+ version = project?.adaptable.major === major ? project.adaptable.installed : undefined;
45
+ }
46
+ else if (projects.length > 1) {
47
+ throw new CapabilityError('MULTIPLE_PROJECTS', `${projects.length} projects at or below ${cwd} depend on AdapTable: ${projects.map((p) => p.path).join(', ')}.`, 'Run from one project folder, or pass --cwd <folder> (or --major to skip detection).');
48
+ }
49
+ else if (project?.adaptable.major !== undefined) {
50
+ source = 'detected';
51
+ major = project.adaptable.major;
52
+ version = project.adaptable.installed;
53
+ if (!version && project.adaptable.range) {
54
+ warnings.push(`${project.adaptable.name} is declared (${project.adaptable.range}) but not installed at ${project.path}; using major ${major} from the declared range. Install dependencies so checks use the exact version.`);
55
+ }
56
+ }
57
+ else {
58
+ source = 'latest';
59
+ latest = await (deps.latest ?? noLatest)();
60
+ major = latest?.adaptableMajor;
61
+ version = latest?.adaptableVersion;
62
+ const where = project
63
+ ? `${project.adaptable.name} at ${project.path} declares "${project.adaptable.range}", which names no major`
64
+ : `No @adaptabletools/* dependency found at or above ${cwd}`;
65
+ warnings.push(major !== undefined
66
+ ? `${where}; assuming AdapTable ${major}, the latest release. Pass --major to override.`
67
+ : `${where}, and the latest release could not be determined (offline without a manifest snapshot). Pass --major.`);
68
+ }
69
+ const framework = options.framework ?? deps.session?.framework ?? project?.framework;
70
+ if (!options.docsHost && !latest) {
71
+ latest = await (deps.latest ?? noLatest)();
72
+ }
73
+ const docsHost = docsHostFor(major, docsHostInfo(latest), options.docsHost ?? process.env.ADAPTABLE_MCP_DOCS_HOST);
74
+ const context = {
75
+ ...(version !== undefined ? { adaptableVersion: version } : {}),
76
+ ...(major !== undefined ? { adaptableMajor: major } : {}),
77
+ ...(project?.agGrid?.installed ? { agGridVersion: project.agGrid.installed } : {}),
78
+ ...(framework ? { framework } : {}),
79
+ source,
80
+ docsHost,
81
+ codeSource: version !== undefined && project?.adaptable.installed === version ? 'installed' : 'none',
82
+ };
83
+ return { context, warnings, project };
84
+ }
85
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/core/context/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AAwBnE,MAAM,YAAY,GAAG,CAAC,MAA8B,EAAgB,EAAE,CAAC,CAAC;IACtE,WAAW,EAAE,MAAM,EAAE,cAAc;IACnC,SAAS,EAAE,MAAM,EAAE,SAAS;CAC7B,CAAC,CAAC;AAeH,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAqC,EAAE,CAAC,SAAS,CAAC;AAE/E,SAAS,oBAAoB,CAAC,KAAa;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;QACxD,MAAM,IAAI,eAAe,CACvB,uBAAuB,EACvB,aAAa,KAAK,oCAAoC,EACtD,gCAAgC,eAAe,YAAY,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,OAA4B,EAAE;IAE9B,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,IAAI,MAAiC,CAAC;IACtC,IAAI,KAAyB,CAAC;IAC9B,IAAI,OAA2B,CAAC;IAChC,IAAI,MAA8B,CAAC;IAEnC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,UAAU,CAAC;QACpB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACtB,OAAO,GAAG,OAAO,EAAE,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,SAAS,CAAC;QACnB,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QACpC,OAAO,GAAG,OAAO,EAAE,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CACvB,mBAAmB,EACnB,GAAG,QAAQ,CAAC,MAAM,yBAAyB,GAAG,yBAAyB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAChH,qFAAqF,CACtF,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,EAAE,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,GAAG,UAAU,CAAC;QACpB,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CACX,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,iBAAiB,OAAO,CAAC,SAAS,CAAC,KAAK,0BAA0B,OAAO,CAAC,IAAI,iBAAiB,KAAK,iFAAiF,CAC/M,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,QAAQ,CAAC;QAClB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC3C,KAAK,GAAG,MAAM,EAAE,cAAc,CAAC;QAC/B,OAAO,GAAG,MAAM,EAAE,gBAAgB,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO;YACnB,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,cAAc,OAAO,CAAC,SAAS,CAAC,KAAK,yBAAyB;YAC5G,CAAC,CAAC,qDAAqD,GAAG,EAAE,CAAC;QAC/D,QAAQ,CAAC,IAAI,CACX,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,GAAG,KAAK,wBAAwB,KAAK,iDAAiD;YACxF,CAAC,CAAC,GAAG,KAAK,uGAAuG,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAA0B,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS,CAAC;IAE5G,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAEnH,MAAM,OAAO,GAAoB;QAC/B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM;QACN,QAAQ;QACR,UAAU,EAAE,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;KACrG,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** `--area` of `docs list|search` (plan §8.3) → the `pages.json` categories it covers */
2
+ export const AREAS = ['handbook', 'dev-guide', 'reference', 'tutorial', 'support', 'all'];
3
+ const AREA_CATEGORIES = {
4
+ handbook: ['handbook', 'ui', 'adaptable-ql', 'framework', 'integrations', 'adaptable-server'],
5
+ 'dev-guide': ['dev-guide'],
6
+ reference: ['api', 'technical-reference'],
7
+ tutorial: ['getting-started', 'demos', 'documentation'],
8
+ support: ['support', 'release-notes'],
9
+ };
10
+ /** Categories for an area; undefined for `all` */
11
+ export function categoriesFor(area) {
12
+ return area && area !== 'all' ? AREA_CATEGORIES[area] : undefined;
13
+ }
14
+ export function areaOf(category) {
15
+ for (const [area, categories] of Object.entries(AREA_CATEGORIES)) {
16
+ if (categories.includes(category)) {
17
+ return area;
18
+ }
19
+ }
20
+ return 'handbook';
21
+ }
22
+ //# sourceMappingURL=areas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"areas.js","sourceRoot":"","sources":["../../../src/core/docs/areas.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC;AAGnG,MAAM,eAAe,GAA2C;IAC9D,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,CAAC;IAC7F,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACzC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,OAAO,EAAE,eAAe,CAAC;IACvD,OAAO,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC;CACtC,CAAC;AAEF,kDAAkD;AAClD,MAAM,UAAU,aAAa,CAAC,IAAsB;IAClD,OAAO,IAAI,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,QAAgB;IACrC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAuC,EAAE,CAAC;QACvG,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * The docs corpus cache (plan §8.3 "Freshness"): `pages.json` and `llms-full.txt`
3
+ * live under `docs/<host>/<files hash>/`, where the hash is taken from the
4
+ * manifest's `files` block, so a deploy that changes the docs changes the folder
5
+ * and nothing else triggers a download. Offline, the newest cached corpus for the
6
+ * host is used with a warning.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { hostCacheDir } from '../compat/manifest.js';
12
+ import { splitPages, splitSections } from './corpus.js';
13
+ import { docsNotAvailable, resolveDocsSource } from './hosts.js';
14
+ import { SectionIndex } from './search.js';
15
+ const CORPUS_FILES = { full: 'llms-full.txt', pages: 'pages.json' };
16
+ const FETCH_TIMEOUT_MS = 60_000;
17
+ /** Short hash of the manifest's file hashes: the corpus folder name */
18
+ export function corpusKey(manifest) {
19
+ const hashes = Object.keys(manifest.files)
20
+ .sort()
21
+ .map((name) => `${name}:${manifest.files[name].sha256}`)
22
+ .join('\n');
23
+ return createHash('sha256').update(hashes).digest('hex').slice(0, 16);
24
+ }
25
+ export function corpusDir(host, manifest) {
26
+ return join(hostCacheDir(host), corpusKey(manifest));
27
+ }
28
+ const isComplete = (dir) => Object.values(CORPUS_FILES).every((file) => existsSync(join(dir, file)));
29
+ /** The newest complete corpus folder cached for a host, by modification time */
30
+ function newestCachedCorpus(host) {
31
+ const root = hostCacheDir(host);
32
+ let entries;
33
+ try {
34
+ entries = readdirSync(root);
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ return entries
40
+ .map((name) => join(root, name))
41
+ .filter((dir) => statSync(dir).isDirectory() && isComplete(dir))
42
+ .sort((a, b) => statSync(b).mtimeMs - statSync(a).mtimeMs)[0];
43
+ }
44
+ async function download(host, path) {
45
+ const url = `${host}${path}`;
46
+ const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
47
+ if (!response.ok) {
48
+ throw new Error(`${url} returned ${response.status}`);
49
+ }
50
+ return response.text();
51
+ }
52
+ function buildCorpus(source, origin, dir) {
53
+ const pagesJson = readFileSync(join(dir, CORPUS_FILES.pages), 'utf8');
54
+ const llmsFull = readFileSync(join(dir, CORPUS_FILES.full), 'utf8');
55
+ const pageMeta = new Map(JSON.parse(pagesJson).map((meta) => [meta.routePath, meta]));
56
+ const pages = new Map();
57
+ const sections = [];
58
+ for (const page of splitPages(llmsFull, pageMeta)) {
59
+ pages.set(page.routePath, page);
60
+ sections.push(...splitSections(page, sections.length));
61
+ }
62
+ return {
63
+ manifest: source.manifest,
64
+ host: source.host,
65
+ origin,
66
+ pages,
67
+ pageMeta,
68
+ sections,
69
+ index: new SectionIndex(sections),
70
+ };
71
+ }
72
+ async function loadUncached(source, options) {
73
+ const warnings = [...source.warnings];
74
+ const { host, manifest } = source;
75
+ const files = manifest.files ?? {};
76
+ if (!files.pages?.path || !files.llmsFullTxt?.path) {
77
+ throw docsNotAvailable(host, 'The docs manifest lists no pages.json / llms-full.txt');
78
+ }
79
+ const dir = corpusDir(host, manifest);
80
+ if (isComplete(dir)) {
81
+ return { corpus: buildCorpus(source, 'cache', dir), warnings };
82
+ }
83
+ if (options.offline) {
84
+ const fallback = newestCachedCorpus(host);
85
+ if (!fallback) {
86
+ throw docsNotAvailable(host, '--offline and no docs corpus is cached');
87
+ }
88
+ warnings.push(`--offline: using the most recent docs corpus cached for ${host}, which predates the current manifest.`);
89
+ return { corpus: buildCorpus(source, 'cache', fallback), warnings };
90
+ }
91
+ try {
92
+ const [pagesJson, llmsFull] = await Promise.all([download(host, files.pages.path), download(host, files.llmsFullTxt.path)]);
93
+ mkdirSync(dir, { recursive: true });
94
+ writeFileSync(join(dir, CORPUS_FILES.pages), pagesJson);
95
+ writeFileSync(join(dir, CORPUS_FILES.full), llmsFull);
96
+ writeFileSync(join(dir, 'manifest.json'), JSON.stringify(manifest, null, 2));
97
+ }
98
+ catch (error) {
99
+ const fallback = newestCachedCorpus(host);
100
+ const reason = error instanceof Error ? error.message : String(error);
101
+ if (!fallback) {
102
+ throw docsNotAvailable(host, `Could not download the docs corpus: ${reason}`);
103
+ }
104
+ warnings.push(`Could not download the docs corpus (${reason}); using the most recent one cached for ${host}.`);
105
+ return { corpus: buildCorpus(source, 'cache', fallback), warnings };
106
+ }
107
+ return { corpus: buildCorpus(source, 'host', dir), warnings };
108
+ }
109
+ const corpora = new Map();
110
+ /**
111
+ * The corpus for a major (or the current host): host resolution, manifest
112
+ * re-validation, cache lookup or download. Memoised per host + manifest hash
113
+ * within the process; the manifest re-validation is governed by `revalidateTtlMs`.
114
+ */
115
+ export async function loadCorpus(options = {}) {
116
+ const source = await resolveDocsSource(options);
117
+ const key = `${source.host}/${corpusKey(source.manifest)}`;
118
+ let loaded = corpora.get(key);
119
+ if (!loaded) {
120
+ loaded = loadUncached(source, options);
121
+ loaded.catch(() => corpora.delete(key));
122
+ corpora.set(key, loaded);
123
+ }
124
+ const result = await loaded;
125
+ // the memoised load carries its own warnings; the fresh source resolution may add new ones
126
+ const warnings = [...new Set([...result.warnings, ...source.warnings])];
127
+ return { corpus: result.corpus, warnings };
128
+ }
129
+ /** Test hook: forget memoised corpora */
130
+ export function resetCorpusCache() {
131
+ corpora.clear();
132
+ }
133
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/core/docs/cache.ts"],"names":[],"mappings":"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"}