@cogenta/cli 0.3.0 → 0.6.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.
- package/CHANGELOG.md +3856 -0
- package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
- package/dist/admin-assets/assets/index-fYXyHpn8.js +1090 -0
- package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
- package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
- package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
- package/dist/admin-assets/branding/logo-cogenta.png +0 -0
- package/dist/admin-assets/favicon.png +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-400.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-500.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-600.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-mono-700.woff2 +0 -0
- package/dist/admin-assets/fonts/ibm-plex-sans-var.woff2 +0 -0
- package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
- package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
- package/dist/admin-assets/index.html +3 -2
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/admin-assets.d.ts +1 -0
- package/dist/commands/admin-assets.d.ts.map +1 -1
- package/dist/commands/admin-assets.js +19 -1
- package/dist/commands/admin-assets.js.map +1 -1
- package/dist/commands/agent-runtime.d.ts +151 -0
- package/dist/commands/agent-runtime.d.ts.map +1 -0
- package/dist/commands/agent-runtime.js +519 -0
- package/dist/commands/agent-runtime.js.map +1 -0
- package/dist/commands/assistant.d.ts +89 -3
- package/dist/commands/assistant.d.ts.map +1 -1
- package/dist/commands/assistant.js +206 -39
- package/dist/commands/assistant.js.map +1 -1
- package/dist/commands/audit-integrity-alert.d.ts +23 -0
- package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
- package/dist/commands/audit-integrity-alert.js +33 -0
- package/dist/commands/audit-integrity-alert.js.map +1 -0
- package/dist/commands/backup.d.ts +78 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +238 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/channels.d.ts +47 -0
- package/dist/commands/channels.d.ts.map +1 -0
- package/dist/commands/channels.js +277 -0
- package/dist/commands/channels.js.map +1 -0
- package/dist/commands/default-logo.d.ts +27 -0
- package/dist/commands/default-logo.d.ts.map +1 -0
- package/dist/commands/default-logo.js +30 -0
- package/dist/commands/default-logo.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +74 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +22 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/forms-page.d.ts +75 -0
- package/dist/commands/forms-page.d.ts.map +1 -0
- package/dist/commands/forms-page.js +191 -0
- package/dist/commands/forms-page.js.map +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +13 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/mcp.d.ts +35 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +277 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/roles.d.ts +22 -0
- package/dist/commands/roles.d.ts.map +1 -0
- package/dist/commands/roles.js +79 -0
- package/dist/commands/roles.js.map +1 -0
- package/dist/commands/search-page.d.ts +15 -0
- package/dist/commands/search-page.d.ts.map +1 -1
- package/dist/commands/search-page.js +22 -16
- package/dist/commands/search-page.js.map +1 -1
- package/dist/commands/seo.d.ts +92 -4
- package/dist/commands/seo.d.ts.map +1 -1
- package/dist/commands/seo.js +168 -4
- package/dist/commands/seo.js.map +1 -1
- package/dist/commands/serve.d.ts +489 -6
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +3883 -164
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/site-plan.d.ts +27 -1
- package/dist/commands/site-plan.d.ts.map +1 -1
- package/dist/commands/site-plan.js +71 -4
- package/dist/commands/site-plan.js.map +1 -1
- package/dist/commands/term-archive-page.d.ts +94 -0
- package/dist/commands/term-archive-page.d.ts.map +1 -0
- package/dist/commands/term-archive-page.js +195 -0
- package/dist/commands/term-archive-page.js.map +1 -0
- package/dist/commands/theme-css.d.ts +22 -7
- package/dist/commands/theme-css.d.ts.map +1 -1
- package/dist/commands/theme-css.js +33 -8
- package/dist/commands/theme-css.js.map +1 -1
- package/dist/commands/theme-registry.d.ts +94 -0
- package/dist/commands/theme-registry.d.ts.map +1 -0
- package/dist/commands/theme-registry.js +130 -0
- package/dist/commands/theme-registry.js.map +1 -0
- package/dist/commands/theme-render.d.ts +360 -2
- package/dist/commands/theme-render.d.ts.map +1 -1
- package/dist/commands/theme-render.js +984 -29
- package/dist/commands/theme-render.js.map +1 -1
- package/dist/commands/theme-wiring.d.ts +107 -0
- package/dist/commands/theme-wiring.d.ts.map +1 -0
- package/dist/commands/theme-wiring.js +295 -0
- package/dist/commands/theme-wiring.js.map +1 -0
- package/dist/commands/tools.d.ts +71 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +330 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/update.d.ts +25 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +193 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/users.d.ts.map +1 -1
- package/dist/commands/users.js +6 -36
- package/dist/commands/users.js.map +1 -1
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -4
- package/dist/index.js.map +1 -1
- package/dist/invite-mail.d.ts +39 -0
- package/dist/invite-mail.d.ts.map +1 -0
- package/dist/invite-mail.js +39 -0
- package/dist/invite-mail.js.map +1 -0
- package/dist/reset-mail.d.ts +39 -0
- package/dist/reset-mail.d.ts.map +1 -0
- package/dist/reset-mail.js +45 -0
- package/dist/reset-mail.js.map +1 -0
- package/dist/update/apply.d.ts +54 -0
- package/dist/update/apply.d.ts.map +1 -0
- package/dist/update/apply.js +77 -0
- package/dist/update/apply.js.map +1 -0
- package/dist/update/changelog-risk.d.ts +20 -0
- package/dist/update/changelog-risk.d.ts.map +1 -0
- package/dist/update/changelog-risk.js +55 -0
- package/dist/update/changelog-risk.js.map +1 -0
- package/dist/update/check.d.ts +60 -0
- package/dist/update/check.d.ts.map +1 -0
- package/dist/update/check.js +56 -0
- package/dist/update/check.js.map +1 -0
- package/dist/update/contract-risk.d.ts +55 -0
- package/dist/update/contract-risk.d.ts.map +1 -0
- package/dist/update/contract-risk.js +75 -0
- package/dist/update/contract-risk.js.map +1 -0
- package/dist/update/history.d.ts +30 -0
- package/dist/update/history.d.ts.map +1 -0
- package/dist/update/history.js +38 -0
- package/dist/update/history.js.map +1 -0
- package/dist/update/index.d.ts +28 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +11 -0
- package/dist/update/index.js.map +1 -0
- package/dist/update/list-restore-points.d.ts +20 -0
- package/dist/update/list-restore-points.d.ts.map +1 -0
- package/dist/update/list-restore-points.js +35 -0
- package/dist/update/list-restore-points.js.map +1 -0
- package/dist/update/npm-registry.d.ts +11 -0
- package/dist/update/npm-registry.d.ts.map +1 -0
- package/dist/update/npm-registry.js +74 -0
- package/dist/update/npm-registry.js.map +1 -0
- package/dist/update/restore-point.d.ts +26 -0
- package/dist/update/restore-point.d.ts.map +1 -0
- package/dist/update/restore-point.js +23 -0
- package/dist/update/restore-point.js.map +1 -0
- package/dist/update/tar.d.ts +27 -0
- package/dist/update/tar.d.ts.map +1 -0
- package/dist/update/tar.js +56 -0
- package/dist/update/tar.js.map +1 -0
- package/dist/update/version-compare.d.ts +17 -0
- package/dist/update/version-compare.d.ts.map +1 -0
- package/dist/update/version-compare.js +42 -0
- package/dist/update/version-compare.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +18 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -13
- package/dist/admin-assets/assets/index-Buwdj1V2.js +0 -71
- package/dist/admin-assets/assets/index-Csef0SiA.css +0 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { HONEYPOT_FIELD, isFormFileValue, TIMESTAMP_FIELD } from '@cogenta/forms';
|
|
2
|
+
import { escapeHtmlAttribute, escapeHtmlText } from '@cogenta/seo';
|
|
3
|
+
import { renderPageChrome, } from './theme-render.js';
|
|
4
|
+
function labelFor(field) {
|
|
5
|
+
return field.label + (field.required ? ' *' : '');
|
|
6
|
+
}
|
|
7
|
+
function fieldValueText(state, name) {
|
|
8
|
+
const raw = state.values?.[name];
|
|
9
|
+
if (Array.isArray(raw))
|
|
10
|
+
return raw.join(', ');
|
|
11
|
+
return typeof raw === 'string' ? raw : '';
|
|
12
|
+
}
|
|
13
|
+
function checkedValues(state, name) {
|
|
14
|
+
const raw = state.values?.[name];
|
|
15
|
+
if (Array.isArray(raw))
|
|
16
|
+
return raw.map(String);
|
|
17
|
+
return typeof raw === 'string' && raw !== '' ? [raw] : [];
|
|
18
|
+
}
|
|
19
|
+
function fieldHasError(state, field) {
|
|
20
|
+
return state.errorField === field.name;
|
|
21
|
+
}
|
|
22
|
+
function fieldWrapper(field, hasError, input) {
|
|
23
|
+
const id = `cg-form-field-${field.name}`;
|
|
24
|
+
const errorId = `${id}-error`;
|
|
25
|
+
return `<div class="cg-form__field">
|
|
26
|
+
<label for="${id}">${escapeHtmlText(labelFor(field))}</label>
|
|
27
|
+
${input}
|
|
28
|
+
${field.help !== undefined ? `<p class="cg-form__help">${escapeHtmlText(field.help)}</p>` : ''}
|
|
29
|
+
${hasError ? `<p id="${errorId}" class="cg-form__field-error" role="alert">This field needs your attention.</p>` : ''}
|
|
30
|
+
</div>`;
|
|
31
|
+
}
|
|
32
|
+
function renderField(field, state) {
|
|
33
|
+
const hasError = fieldHasError(state, field);
|
|
34
|
+
const id = `cg-form-field-${field.name}`;
|
|
35
|
+
const errorId = `${id}-error`;
|
|
36
|
+
const describedBy = hasError ? ` aria-describedby="${errorId}"` : '';
|
|
37
|
+
const invalid = ` aria-invalid="${hasError ? 'true' : 'false'}"`;
|
|
38
|
+
const required = field.required ? ' required' : '';
|
|
39
|
+
const name = escapeHtmlAttribute(field.name);
|
|
40
|
+
let input;
|
|
41
|
+
switch (field.kind) {
|
|
42
|
+
case 'text':
|
|
43
|
+
case 'email':
|
|
44
|
+
case 'phone':
|
|
45
|
+
case 'date': {
|
|
46
|
+
const type = field.kind === 'email'
|
|
47
|
+
? 'email'
|
|
48
|
+
: field.kind === 'phone'
|
|
49
|
+
? 'tel'
|
|
50
|
+
: field.kind === 'date'
|
|
51
|
+
? 'date'
|
|
52
|
+
: 'text';
|
|
53
|
+
input = `<input type="${type}" id="${id}" name="${name}"${required}${invalid}${describedBy} value="${escapeHtmlAttribute(fieldValueText(state, field.name))}">`;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'number': {
|
|
57
|
+
input = `<input type="number" id="${id}" name="${name}"${required}${invalid}${describedBy} value="${escapeHtmlAttribute(fieldValueText(state, field.name))}">`;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'longText': {
|
|
61
|
+
input = `<textarea id="${id}" name="${name}"${required}${invalid}${describedBy} rows="5">${escapeHtmlText(fieldValueText(state, field.name))}</textarea>`;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case 'choiceSingle': {
|
|
65
|
+
const options = (field.choices ?? [])
|
|
66
|
+
.map((choice) => {
|
|
67
|
+
const selected = fieldValueText(state, field.name) === choice ? ' selected' : '';
|
|
68
|
+
return `<option value="${escapeHtmlAttribute(choice)}"${selected}>${escapeHtmlText(choice)}</option>`;
|
|
69
|
+
})
|
|
70
|
+
.join('');
|
|
71
|
+
input = `<select id="${id}" name="${name}"${required}${invalid}${describedBy}><option value="">—</option>${options}</select>`;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'choiceMulti': {
|
|
75
|
+
const checked = checkedValues(state, field.name);
|
|
76
|
+
input = (field.choices ?? [])
|
|
77
|
+
.map((choice, index) => {
|
|
78
|
+
const choiceId = `${id}-${index}`;
|
|
79
|
+
const isChecked = checked.includes(choice) ? ' checked' : '';
|
|
80
|
+
return `<label class="cg-form__choice"><input type="checkbox" id="${choiceId}" name="${name}" value="${escapeHtmlAttribute(choice)}"${isChecked}> ${escapeHtmlText(choice)}</label>`;
|
|
81
|
+
})
|
|
82
|
+
.join('');
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'file': {
|
|
86
|
+
// Fiche 47 task 3. A file input can never be pre-filled by a server
|
|
87
|
+
// (browsers refuse it, for good reason) — the best this can do on
|
|
88
|
+
// redisplay is say what is already on file, from a value already
|
|
89
|
+
// resolved to a `FormFileValue` (carried forward via `_accumulated`,
|
|
90
|
+
// or accepted earlier in this very flow before another field failed).
|
|
91
|
+
const already = state.values?.[field.name];
|
|
92
|
+
const note = isFormFileValue(already)
|
|
93
|
+
? `<p class="cg-form__help">Already uploaded: ${escapeHtmlText(already.filename)}. Choose a new file only to replace it.</p>`
|
|
94
|
+
: '';
|
|
95
|
+
return fieldWrapper(field, hasError, `<input type="file" id="${id}" name="${name}"${invalid}${describedBy}>${note}`);
|
|
96
|
+
}
|
|
97
|
+
case 'consent': {
|
|
98
|
+
const isChecked = fieldValueText(state, field.name) === 'true' ? ' checked' : '';
|
|
99
|
+
return `<div class="cg-form__field cg-form__field--consent">
|
|
100
|
+
<label><input type="checkbox" id="${id}" name="${name}" value="true"${required}${invalid}${describedBy}${isChecked}> ${escapeHtmlText(field.consentText ?? field.label)}</label>
|
|
101
|
+
${hasError ? `<p id="${errorId}" class="cg-form__field-error" role="alert">Consent is required to submit this form.</p>` : ''}
|
|
102
|
+
</div>`;
|
|
103
|
+
}
|
|
104
|
+
default: {
|
|
105
|
+
input = '';
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return fieldWrapper(field, hasError, input);
|
|
109
|
+
}
|
|
110
|
+
function confirmationPage(definition, options, context) {
|
|
111
|
+
return shell(definition.label, `<div class="cg-form__confirmation" role="status"><p>${escapeHtmlText(definition.confirmationMessage)}</p></div>`, options, context);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The real site chrome (`renderPageChrome`, `theme-render.ts`) — the same
|
|
115
|
+
* skip link, header and footer every collection page renders, not a second,
|
|
116
|
+
* thinner `<html>` shell of this file's own (L20 audit, points 8-9).
|
|
117
|
+
*/
|
|
118
|
+
async function shell(title, body, options, context) {
|
|
119
|
+
return renderPageChrome({
|
|
120
|
+
site: options.site,
|
|
121
|
+
locale: options.site.defaultLocale,
|
|
122
|
+
styles: options.styles,
|
|
123
|
+
headHtml: `<title>${escapeHtmlText(title)} — ${escapeHtmlText(options.site.name)}</title>`,
|
|
124
|
+
bodyHtml: `<main class="cg-main" id="cg-main">
|
|
125
|
+
<h1 class="cg-page__title">${escapeHtmlText(title)}</h1>
|
|
126
|
+
${body}
|
|
127
|
+
</main>`,
|
|
128
|
+
...(options.menus === undefined ? {} : { menus: options.menus }),
|
|
129
|
+
...(options.branding === undefined ? {} : { branding: options.branding }),
|
|
130
|
+
...(options.activeTheme === undefined ? {} : { activeTheme: options.activeTheme }),
|
|
131
|
+
...(options.seo === undefined ? {} : { seo: options.seo }),
|
|
132
|
+
...(options.identity === undefined ? {} : { identity: options.identity }),
|
|
133
|
+
...(options.loadMedia === undefined ? {} : { loadMedia: options.loadMedia }),
|
|
134
|
+
}, context);
|
|
135
|
+
}
|
|
136
|
+
function stepFieldsOf(definition, stepIndex) {
|
|
137
|
+
const stepsCount = definition.steps.length;
|
|
138
|
+
if (stepsCount <= 1)
|
|
139
|
+
return { fields: definition.fields, isFinalStep: true };
|
|
140
|
+
const clamped = Math.min(Math.max(stepIndex, 0), stepsCount - 1);
|
|
141
|
+
const step = definition.steps[clamped];
|
|
142
|
+
const names = new Set(step?.fieldNames ?? []);
|
|
143
|
+
return {
|
|
144
|
+
fields: definition.fields.filter((field) => names.has(field.name)),
|
|
145
|
+
isFinalStep: clamped >= stepsCount - 1,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The whole page: the form itself (one step of it, for a multi-step form),
|
|
150
|
+
* or its confirmation view under `?submitted=1` when the form has no
|
|
151
|
+
* `redirectTo` of its own.
|
|
152
|
+
*/
|
|
153
|
+
export function renderFormPage(definition, state, options, context) {
|
|
154
|
+
if (state.submitted === true)
|
|
155
|
+
return confirmationPage(definition, options, context);
|
|
156
|
+
const stepIndex = state.step ?? 0;
|
|
157
|
+
const { fields: stepFields, isFinalStep } = stepFieldsOf(definition, stepIndex);
|
|
158
|
+
const isMultiStep = definition.steps.length > 1;
|
|
159
|
+
const errorBanner = state.errorMessage != null
|
|
160
|
+
? `<p class="cg-form__error" role="alert">${escapeHtmlText(state.errorMessage)}</p>`
|
|
161
|
+
: '';
|
|
162
|
+
const fields = stepFields.map((field) => renderField(field, state)).join('\n');
|
|
163
|
+
const ts = state.ts ?? String(options.now());
|
|
164
|
+
const needsMultipart = stepFields.some((field) => field.kind === 'file');
|
|
165
|
+
const stepHiddenFields = isMultiStep
|
|
166
|
+
? `<input type="hidden" name="_step" value="${stepIndex}">
|
|
167
|
+
<input type="hidden" name="_accumulated" value="${escapeHtmlAttribute(JSON.stringify(state.accumulated ?? {}))}">`
|
|
168
|
+
: '';
|
|
169
|
+
const captcha = isFinalStep && definition.captcha.enabled
|
|
170
|
+
? `<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
|
171
|
+
<div class="cf-turnstile" data-sitekey="${escapeHtmlAttribute(definition.captcha.siteKey ?? '')}"></div>`
|
|
172
|
+
: '';
|
|
173
|
+
const submitLabel = isFinalStep ? 'Send' : 'Next';
|
|
174
|
+
const body = `${errorBanner}
|
|
175
|
+
<form class="cg-form" method="post" action="/api/forms/${encodeURIComponent(definition.name)}/submit"${needsMultipart ? ' enctype="multipart/form-data"' : ''}>
|
|
176
|
+
${fields}
|
|
177
|
+
${stepHiddenFields}
|
|
178
|
+
<div class="cg-form__honeypot" aria-hidden="true" style="position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;overflow:hidden;">
|
|
179
|
+
<label for="cg-form-hp">Leave this field empty</label>
|
|
180
|
+
<input type="text" id="cg-form-hp" name="${HONEYPOT_FIELD}" tabindex="-1" autocomplete="off" value="">
|
|
181
|
+
</div>
|
|
182
|
+
<input type="hidden" name="${TIMESTAMP_FIELD}" value="${escapeHtmlAttribute(ts)}">
|
|
183
|
+
${captcha}
|
|
184
|
+
<button type="submit">${submitLabel}</button>
|
|
185
|
+
</form>`;
|
|
186
|
+
return shell(definition.label, body, options, context);
|
|
187
|
+
}
|
|
188
|
+
export function renderFormNotFoundPage(options, context) {
|
|
189
|
+
return shell('Not found', '<p>This form does not exist, or is not accepting submissions.</p>', options, context);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=forms-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms-page.js","sourceRoot":"","sources":["../../src/commands/forms-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,MAAM,EAGZ,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAE1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AA+BD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDvE"}
|
package/dist/commands/import.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import process from 'node:process';
|
|
3
|
+
import { createCommentStore, ensureCommentsTables } from '@cogenta/comments';
|
|
3
4
|
import { createDatabaseRegistry, createLogger, createStorageRegistry, isCogentaError, loadConfig, } from '@cogenta/core';
|
|
4
5
|
import { formatConversionReport, importWordPress } from '@cogenta/import';
|
|
5
6
|
const USAGE = `Usage
|
|
@@ -57,7 +58,18 @@ export async function runImport(options) {
|
|
|
57
58
|
return 1;
|
|
58
59
|
}
|
|
59
60
|
try {
|
|
60
|
-
const report = await withSite(options, logger, (db, storage) =>
|
|
61
|
+
const report = await withSite(options, logger, async (db, storage) => {
|
|
62
|
+
// Contract F (ADR-0025): the CLI always passes a real comment store —
|
|
63
|
+
// `cogenta import wordpress` is the one caller of `importWordPress`
|
|
64
|
+
// this project ships, and a WordPress export with comments deserves
|
|
65
|
+
// to keep them with real status and threading, not the legacy
|
|
66
|
+
// synthetic collection (`ImportWordPressOptions.comments`'s own
|
|
67
|
+
// comment explains the fallback that exists only for a caller that
|
|
68
|
+
// has not wired this yet).
|
|
69
|
+
await ensureCommentsTables(db);
|
|
70
|
+
const comments = createCommentStore({ db });
|
|
71
|
+
return importWordPress(xml, { db, storage, comments });
|
|
72
|
+
});
|
|
61
73
|
out.heading('WordPress import');
|
|
62
74
|
out.line(formatConversionReport(report));
|
|
63
75
|
return 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EAErB,cAAc,EAEd,UAAU,GAEX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAezE,MAAM,KAAK,GAAG;;;;;;;CAOb,CAAA;AAED,KAAK,UAAU,QAAQ,CACrB,OAAsB,EACtB,MAAc,EACd,GAA+D;IAE/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1D,GAAG;KACJ,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3F,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9F,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IACnE,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB;IACpD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAE/B,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAA;QACxD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,uBAAuB,OAAO,CAAC,UAAU,SAAS,KAAK,EAAE,CAAC,CAAA;QACjE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAElE,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CACJ,mBAAmB,OAAO,CAAC,IAAI,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAChG,CAAA;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Logger } from '@cogenta/core';
|
|
2
|
+
import type { Output, Writer } from '../output.js';
|
|
3
|
+
export interface McpOptions {
|
|
4
|
+
readonly cwd?: string;
|
|
5
|
+
readonly env?: Record<string, string | undefined>;
|
|
6
|
+
readonly logger?: Logger;
|
|
7
|
+
readonly out: Output;
|
|
8
|
+
readonly stderr: Writer;
|
|
9
|
+
/** Resolves the acting user from the real user store — the process that launched this command IS that user. */
|
|
10
|
+
readonly email?: string;
|
|
11
|
+
/** A synthetic actor for local testing (`--role viewer`), never combined with --email. */
|
|
12
|
+
readonly role?: string;
|
|
13
|
+
/**
|
|
14
|
+
* A machine-to-machine bearer credential minted from the admin's "MCP"
|
|
15
|
+
* screen (or the generic "Clés API" one) — resolved through the exact same
|
|
16
|
+
* `ApiKeyStore` REST's `resolveActor` verifies against
|
|
17
|
+
* (`@cogenta/auth`'s `createApiKeyStore`), never a second store. The
|
|
18
|
+
* actor's roles are the key's `scope`, and its id is `apikey:<key id>`,
|
|
19
|
+
* mirroring `resolveApiKeyActor` in `@cogenta/api` byte for byte — a role
|
|
20
|
+
* this key was not granted is refused by the same `PermissionLayer` REST
|
|
21
|
+
* uses, not by anything specific to MCP. Never combined with --email or
|
|
22
|
+
* --role.
|
|
23
|
+
*/
|
|
24
|
+
readonly apiKey?: string;
|
|
25
|
+
/** Injectable for tests — defaults to the real process streams. */
|
|
26
|
+
readonly stdin?: NodeJS.ReadableStream;
|
|
27
|
+
readonly stdout?: NodeJS.WritableStream;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* `cogenta mcp` — a real MCP server over stdin/stdout, wired to this site's
|
|
31
|
+
* actual content and tools. `serveMcpOverStdio` never returns on its own; the
|
|
32
|
+
* process exits when its stdin closes (the spawning client disconnected).
|
|
33
|
+
*/
|
|
34
|
+
export declare function runMcp(options: McpOptions): Promise<number>;
|
|
35
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AA4BA,OAAO,EAOL,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAA;AAWtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+GAA+G;IAC/G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;CACxC;AAiND;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FjE"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { dirname } from 'node:path';
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
import { buildManifest, createContentDeleteTool, createContentPublishTool, createContentReadTool, createContentWriteDraftTool, createMediaReadTool, createMediaWriteTool, createSiteConfigReadTool, createToolRegistry, } from '@cogenta/agents';
|
|
4
|
+
import { createContentService, createPermissionLayer, } from '@cogenta/api';
|
|
5
|
+
import { createApiKeyStore, createUserStore, ensureAuthTables, looksLikeApiKey, } from '@cogenta/auth';
|
|
6
|
+
import { CogentaError, createDatabaseMediaStore, createDatabaseRegistry, createLogger, isCogentaError, loadConfig, } from '@cogenta/core';
|
|
7
|
+
import { createMcpServer, serveMcpOverStdio } from '@cogenta/mcp';
|
|
8
|
+
import { createContentStore, createRolePermissionOverlay, createRolePermissionStore, createSchemaTables, } from '@cogenta/schema';
|
|
9
|
+
import { loadSchemaModule } from './serve.js';
|
|
10
|
+
const USAGE = `Usage
|
|
11
|
+
cogenta mcp [--email <email> | --role <role> | --api-key <key>]
|
|
12
|
+
|
|
13
|
+
Starts an MCP (Model Context Protocol) server on stdin/stdout, exposing this
|
|
14
|
+
site's content and site tools to whatever process spawned this command
|
|
15
|
+
(Claude Desktop, Claude Code, Cursor, or any other MCP client). See
|
|
16
|
+
packages/mcp/README.md for how to connect one.
|
|
17
|
+
|
|
18
|
+
--email resolves the acting user from this site's own user store: every tool
|
|
19
|
+
call runs with that user's real roles, checked by the same permission layer
|
|
20
|
+
REST and GraphQL use (R4). --role hands a synthetic actor with no id and the
|
|
21
|
+
named role(s) (comma-separated) — meant for local testing, never for a real
|
|
22
|
+
deployment. --api-key resolves the acting roles from a key minted in the
|
|
23
|
+
admin's "MCP" or "Clés API" screen, through the exact same key store and
|
|
24
|
+
verification REST uses for that key — a role the key was not granted is
|
|
25
|
+
refused by the same permission layer, exactly as it would be over HTTP.
|
|
26
|
+
|
|
27
|
+
With none of these flags, tool calls run as an anonymous ("public") actor:
|
|
28
|
+
content tools still run through the real permission layer (a public actor
|
|
29
|
+
sees only what a public actor may see), but media, site-config and
|
|
30
|
+
HTTP-fetch tools — which have no permission check of their own to fall back
|
|
31
|
+
on — are left out of the manifest entirely. See BLOCKERS.md, "MCP actor
|
|
32
|
+
scoping", for why.
|
|
33
|
+
|
|
34
|
+
Options
|
|
35
|
+
--email <email> Run as this user (looked up in the user store; must exist)
|
|
36
|
+
--role <role,…> Run as a synthetic actor with these roles, no real user
|
|
37
|
+
--api-key <key> Run as the actor a "cogenta_sk_…" API key was granted
|
|
38
|
+
`;
|
|
39
|
+
/** A fresh, undecorated store per collection: an MCP tool call reads and writes content the same way `cogenta serve`'s REST/GraphQL routes do, through the real permission layer, but does not carry the search/redirect/schedule/vector decorators `assembleSite` wraps around a store — those are cache and derived-index maintenance, not permission-relevant, and wiring the whole of `assembleSite` into a single stdio command is out of this task's scope (see BLOCKERS.md). */
|
|
40
|
+
function storeForFactory(db, collections) {
|
|
41
|
+
const cache = new Map();
|
|
42
|
+
return (collection) => {
|
|
43
|
+
const existing = cache.get(collection.name);
|
|
44
|
+
if (existing !== undefined)
|
|
45
|
+
return existing;
|
|
46
|
+
const created = createContentStore({ db, collection, siblings: collections });
|
|
47
|
+
cache.set(collection.name, created);
|
|
48
|
+
return created;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Adapts `@cogenta/api`'s real `ContentService` to the narrow
|
|
53
|
+
* `ContentServiceLike` the core content tools (`@cogenta/agents`) declare
|
|
54
|
+
* against — a `SerialisedEntry` is a plain, already-JSON-safe object (the
|
|
55
|
+
* exact shape REST hands back as `data`), it merely lacks the string index
|
|
56
|
+
* signature `Record<string, unknown>` promises structurally. Runtime shape
|
|
57
|
+
* is identical; this is a type-level seam only.
|
|
58
|
+
*/
|
|
59
|
+
function contentServiceLikeOf(service) {
|
|
60
|
+
return {
|
|
61
|
+
read: (context, collection, id, options) => service.read(context, collection, id, options),
|
|
62
|
+
create: (context, collection, input, options) => service.create(context, collection, input, options),
|
|
63
|
+
update: (context, collection, id, input, options) => service.update(context, collection, id, input, options),
|
|
64
|
+
publish: (context, collection, id, input, options) => service.publish(context, collection, id, input, options),
|
|
65
|
+
remove: (context, collection, id) => service.remove(context, collection, id),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolves the actor this MCP server's tool calls will run as.
|
|
70
|
+
*
|
|
71
|
+
* `--email` looks the user up in the real user store — the account must
|
|
72
|
+
* already exist (`cogenta users create`); this command never creates one.
|
|
73
|
+
* `--role` is a synthetic actor for local testing. `--api-key` resolves
|
|
74
|
+
* through the same `ApiKeyStore` (`@cogenta/auth`) REST's `resolveActor`
|
|
75
|
+
* verifies against — one store, two callers, never a second lookup path.
|
|
76
|
+
* None given: the anonymous ("public") actor, same as an unauthenticated
|
|
77
|
+
* REST request.
|
|
78
|
+
*/
|
|
79
|
+
async function resolveMcpActor(options, db) {
|
|
80
|
+
const given = [options.email, options.role, options.apiKey].filter((value) => value !== undefined).length;
|
|
81
|
+
if (given > 1) {
|
|
82
|
+
throw new CogentaError({
|
|
83
|
+
code: 'MCP_ACTOR_OPTIONS_CONFLICT',
|
|
84
|
+
message: '--email, --role and --api-key are mutually exclusive.',
|
|
85
|
+
hint: 'Pass exactly one: --email resolves a real user, --role is a synthetic test actor, --api-key resolves a minted key.',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (options.apiKey !== undefined) {
|
|
89
|
+
if (!looksLikeApiKey(options.apiKey)) {
|
|
90
|
+
throw new CogentaError({
|
|
91
|
+
code: 'MCP_ACTOR_API_KEY_INVALID',
|
|
92
|
+
message: 'That does not look like a Cogenta API key.',
|
|
93
|
+
hint: 'A real key starts with "cogenta_sk_" — copy it again from the admin\'s "MCP" screen.',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
await ensureAuthTables(db);
|
|
97
|
+
const apiKeys = createApiKeyStore(db);
|
|
98
|
+
const key = await apiKeys.verify(options.apiKey);
|
|
99
|
+
if (key === null) {
|
|
100
|
+
throw new CogentaError({
|
|
101
|
+
code: 'MCP_ACTOR_API_KEY_INVALID',
|
|
102
|
+
message: 'This API key is unknown, revoked, or expired.',
|
|
103
|
+
hint: 'Mint a new one from the admin\'s "MCP" screen, or "Clés API" for a general-purpose key.',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Mirrors `resolveApiKeyActor` in `@cogenta/api` (`packages/api/src/rest/auth-router.ts`)
|
|
107
|
+
// exactly: the same id shape and the same "roles = scope" mapping, so a
|
|
108
|
+
// key behaves identically whether it authenticates an HTTP request or
|
|
109
|
+
// this stdio server.
|
|
110
|
+
return { actor: { id: `apikey:${key.id}`, roles: key.scope }, authenticated: true };
|
|
111
|
+
}
|
|
112
|
+
if (options.email !== undefined) {
|
|
113
|
+
await ensureAuthTables(db);
|
|
114
|
+
const users = createUserStore(db);
|
|
115
|
+
const user = await users.byEmail(options.email);
|
|
116
|
+
if (user === null) {
|
|
117
|
+
throw new CogentaError({
|
|
118
|
+
code: 'MCP_ACTOR_USER_NOT_FOUND',
|
|
119
|
+
message: `No user with email "${options.email}".`,
|
|
120
|
+
hint: 'Create the account first with "cogenta users create --email <email> --roles <role,role>".',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return { actor: { id: user.id, roles: user.roles }, authenticated: true };
|
|
124
|
+
}
|
|
125
|
+
if (options.role !== undefined) {
|
|
126
|
+
const roles = options.role
|
|
127
|
+
.split(',')
|
|
128
|
+
.map((role) => role.trim())
|
|
129
|
+
.filter((role) => role.length > 0);
|
|
130
|
+
if (roles.length === 0) {
|
|
131
|
+
throw new CogentaError({
|
|
132
|
+
code: 'MCP_ACTOR_ROLE_EMPTY',
|
|
133
|
+
message: '--role was given but named no role.',
|
|
134
|
+
hint: 'Pass at least one role name, e.g. --role viewer or --role editor,reviewer.',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return { actor: { id: null, roles }, authenticated: true };
|
|
138
|
+
}
|
|
139
|
+
return { actor: { id: null, roles: ['public'] }, authenticated: false };
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Builds this site's real tool manifest for the resolved actor.
|
|
143
|
+
*
|
|
144
|
+
* Content tools (`content.*`) are always included: their actual permission
|
|
145
|
+
* gate lives inside `ContentService`, which calls the same `PermissionLayer`
|
|
146
|
+
* REST and GraphQL use, on every call, keyed on `ctx.actor` — so an anonymous
|
|
147
|
+
* actor is already refused whatever a `public` role may not read or write,
|
|
148
|
+
* exactly as it would be over HTTP.
|
|
149
|
+
*
|
|
150
|
+
* Media, site-config and HTTP-fetch tools have no such internal check (their
|
|
151
|
+
* own doc comments say so plainly: "this tool's declared permissions is the
|
|
152
|
+
* actual gate, enforced by the manifest" — meaning by *this* function, not by
|
|
153
|
+
* the store). They are therefore included only for an authenticated actor
|
|
154
|
+
* (`--email` or `--role`), never for the anonymous default — R4 requires a
|
|
155
|
+
* runtime check somewhere, and for these three tools the manifest boundary is
|
|
156
|
+
* the only place that check can happen.
|
|
157
|
+
*/
|
|
158
|
+
function buildSiteManifest(options) {
|
|
159
|
+
const registered = [
|
|
160
|
+
createContentReadTool(options.contentService),
|
|
161
|
+
createContentWriteDraftTool(options.contentService),
|
|
162
|
+
createContentPublishTool(options.contentService),
|
|
163
|
+
createContentDeleteTool(options.contentService),
|
|
164
|
+
];
|
|
165
|
+
if (options.authenticated) {
|
|
166
|
+
registered.push(createMediaReadTool(options.mediaStore), createMediaWriteTool(options.mediaStore), createSiteConfigReadTool());
|
|
167
|
+
}
|
|
168
|
+
const registry = createToolRegistry(registered);
|
|
169
|
+
return buildManifest(registry, registered.map((tool) => tool.name), {
|
|
170
|
+
site: options.site,
|
|
171
|
+
actor: options.actor,
|
|
172
|
+
logger: {
|
|
173
|
+
info: (message, fields) => options.logger.info(message, fields),
|
|
174
|
+
warn: (message, fields) => options.logger.warn(message, fields),
|
|
175
|
+
error: (message, fields) => options.logger.error(message, fields),
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* `cogenta mcp` — a real MCP server over stdin/stdout, wired to this site's
|
|
181
|
+
* actual content and tools. `serveMcpOverStdio` never returns on its own; the
|
|
182
|
+
* process exits when its stdin closes (the spawning client disconnected).
|
|
183
|
+
*/
|
|
184
|
+
export async function runMcp(options) {
|
|
185
|
+
const { out, stderr } = options;
|
|
186
|
+
const env = options.env ?? process.env;
|
|
187
|
+
const logger = options.logger ?? createLogger({ level: 'silent' });
|
|
188
|
+
if ([options.email, options.role, options.apiKey].filter((value) => value !== undefined).length > 1) {
|
|
189
|
+
stderr(`--email, --role and --api-key are mutually exclusive.\n\n${USAGE}`);
|
|
190
|
+
return 2;
|
|
191
|
+
}
|
|
192
|
+
let loaded;
|
|
193
|
+
try {
|
|
194
|
+
loaded = await loadConfig({
|
|
195
|
+
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
196
|
+
env,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
return reportFailure(stderr, error);
|
|
201
|
+
}
|
|
202
|
+
const projectRoot = loaded.path === null ? (options.cwd ?? process.cwd()) : dirname(loaded.path);
|
|
203
|
+
let collections;
|
|
204
|
+
let taxonomies;
|
|
205
|
+
try {
|
|
206
|
+
const loadedSchema = await loadSchemaModule(projectRoot);
|
|
207
|
+
collections = loadedSchema.collections;
|
|
208
|
+
taxonomies = loadedSchema.taxonomies;
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return reportFailure(stderr, error);
|
|
212
|
+
}
|
|
213
|
+
const selection = await createDatabaseRegistry({ logger }).select(loaded.config.database);
|
|
214
|
+
const db = selection.instance;
|
|
215
|
+
try {
|
|
216
|
+
await createSchemaTables(db, collections, []);
|
|
217
|
+
const { actor, authenticated } = await resolveMcpActor(options, db);
|
|
218
|
+
// Fiche 63, ADR-0028: `cogenta mcp` builds its own `PermissionLayer`
|
|
219
|
+
// (never `assembleSite`'s), so it must consult the same override table —
|
|
220
|
+
// otherwise a permission an admin just revoked in production would stay
|
|
221
|
+
// granted to any MCP client until the process restarts, exactly the
|
|
222
|
+
// silent-widening R4 exists to prevent.
|
|
223
|
+
const rolePermissionOverlay = await createRolePermissionOverlay(createRolePermissionStore({ db, collections, taxonomies }));
|
|
224
|
+
const permissions = createPermissionLayer({
|
|
225
|
+
collections,
|
|
226
|
+
rolePermissionOverrides: rolePermissionOverlay,
|
|
227
|
+
});
|
|
228
|
+
const storeFor = storeForFactory(db, collections);
|
|
229
|
+
const contentService = createContentService({ collections, permissions, storeFor });
|
|
230
|
+
const mediaStore = createDatabaseMediaStore({ db });
|
|
231
|
+
const tools = buildSiteManifest({
|
|
232
|
+
contentService: contentServiceLikeOf(contentService),
|
|
233
|
+
mediaStore,
|
|
234
|
+
site: {
|
|
235
|
+
name: loaded.config.site.name,
|
|
236
|
+
...(loaded.config.site.url === undefined ? {} : { url: loaded.config.site.url }),
|
|
237
|
+
locales: loaded.config.site.locales,
|
|
238
|
+
defaultLocale: loaded.config.site.defaultLocale,
|
|
239
|
+
},
|
|
240
|
+
actor,
|
|
241
|
+
authenticated,
|
|
242
|
+
logger,
|
|
243
|
+
});
|
|
244
|
+
out.detail(`MCP server ready — ${tools.length} tool(s), actor: ${actor.id ?? '(anonymous)'} [${actor.roles.join(', ')}]`);
|
|
245
|
+
const server = createMcpServer({ name: 'cogenta', version: '1.0.0', tools });
|
|
246
|
+
serveMcpOverStdio({
|
|
247
|
+
server,
|
|
248
|
+
...(options.stdin === undefined ? {} : { input: options.stdin }),
|
|
249
|
+
...(options.stdout === undefined ? {} : { output: options.stdout }),
|
|
250
|
+
});
|
|
251
|
+
// Runs until stdin closes (the MCP client disconnected) — this command
|
|
252
|
+
// has no other exit condition, matching stdio MCP servers generally.
|
|
253
|
+
return await new Promise((resolvePromise) => {
|
|
254
|
+
const input = options.stdin ?? process.stdin;
|
|
255
|
+
input.once('end', () => resolvePromise(0));
|
|
256
|
+
input.once('close', () => resolvePromise(0));
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return reportFailure(stderr, error);
|
|
261
|
+
}
|
|
262
|
+
finally {
|
|
263
|
+
await selection.dispose();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function reportFailure(stderr, error) {
|
|
267
|
+
if (isCogentaError(error)) {
|
|
268
|
+
stderr(`${error.code}: ${error.message}\n`);
|
|
269
|
+
if (error.hint !== undefined)
|
|
270
|
+
stderr(`${error.hint}\n`);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
stderr(`${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
|
|
274
|
+
}
|
|
275
|
+
return 1;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Logger } from '@cogenta/core';
|
|
2
|
+
import type { Output, Writer } from '../output.js';
|
|
3
|
+
/**
|
|
4
|
+
* `cogenta roles export` — fiche 63, task 3's last requirement: freeze the
|
|
5
|
+
* `cogenta_role_permissions` table's current state into a file a site can
|
|
6
|
+
* commit to git, for a site that wants to be able to return to an entirely
|
|
7
|
+
* versioned source. The file is a snapshot, never a second thing
|
|
8
|
+
* `PermissionLayer` reads — see `role-permission-export.ts`'s own comment.
|
|
9
|
+
*/
|
|
10
|
+
export type RolesSubcommand = 'export';
|
|
11
|
+
export interface RolesOptions {
|
|
12
|
+
readonly subcommand: string | undefined;
|
|
13
|
+
readonly cwd?: string;
|
|
14
|
+
readonly env?: Record<string, string | undefined>;
|
|
15
|
+
readonly logger?: Logger;
|
|
16
|
+
readonly out: Output;
|
|
17
|
+
readonly stderr: Writer;
|
|
18
|
+
/** `export` only: where to write the file. Defaults to `cogenta.role-permissions.json` at the project root. */
|
|
19
|
+
readonly file?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function runRoles(options: RolesOptions): Promise<number>;
|
|
22
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/commands/roles.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGlD;;;;;;GAMG;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAA;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+GAA+G;IAC/G,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAmED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAarE"}
|