@sentropic/focus 0.3.0 → 0.5.0-rc.10

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 (97) hide show
  1. package/README.md +9 -0
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/editing/anchors.d.ts +14 -0
  4. package/dist/editing/anchors.d.ts.map +1 -0
  5. package/dist/editing/anchors.js +113 -0
  6. package/dist/editing/anchors.js.map +1 -0
  7. package/dist/editing/codec.d.ts +24 -0
  8. package/dist/editing/codec.d.ts.map +1 -0
  9. package/dist/editing/codec.js +143 -0
  10. package/dist/editing/codec.js.map +1 -0
  11. package/dist/editing/contract.d.ts +129 -0
  12. package/dist/editing/contract.d.ts.map +1 -0
  13. package/dist/editing/contract.js +76 -0
  14. package/dist/editing/contract.js.map +1 -0
  15. package/dist/editing/diff.d.ts +12 -0
  16. package/dist/editing/diff.d.ts.map +1 -0
  17. package/dist/editing/diff.js +125 -0
  18. package/dist/editing/diff.js.map +1 -0
  19. package/dist/editing/digest.d.ts +6 -0
  20. package/dist/editing/digest.d.ts.map +1 -0
  21. package/dist/editing/digest.js +56 -0
  22. package/dist/editing/digest.js.map +1 -0
  23. package/dist/editing/index.d.ts +7 -0
  24. package/dist/editing/index.d.ts.map +1 -0
  25. package/dist/editing/index.js +7 -0
  26. package/dist/editing/index.js.map +1 -0
  27. package/dist/editing/reconcile.d.ts +66 -0
  28. package/dist/editing/reconcile.d.ts.map +1 -0
  29. package/dist/editing/reconcile.js +167 -0
  30. package/dist/editing/reconcile.js.map +1 -0
  31. package/dist/editing/structure.d.ts +24 -0
  32. package/dist/editing/structure.d.ts.map +1 -0
  33. package/dist/editing/structure.js +71 -0
  34. package/dist/editing/structure.js.map +1 -0
  35. package/dist/index.d.ts +4 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/model.d.ts +144 -2
  40. package/dist/model.d.ts.map +1 -1
  41. package/dist/model.js +1 -1
  42. package/dist/model.js.map +1 -1
  43. package/dist/registry/definitions.d.ts +159 -0
  44. package/dist/registry/definitions.d.ts.map +1 -0
  45. package/dist/registry/definitions.js +509 -0
  46. package/dist/registry/definitions.js.map +1 -0
  47. package/dist/render/evidence.d.ts +10 -0
  48. package/dist/render/evidence.d.ts.map +1 -0
  49. package/dist/render/evidence.js +37 -0
  50. package/dist/render/evidence.js.map +1 -0
  51. package/dist/render/html.d.ts.map +1 -1
  52. package/dist/render/html.js +14 -1
  53. package/dist/render/html.js.map +1 -1
  54. package/dist/render/md.d.ts.map +1 -1
  55. package/dist/render/md.js +15 -1
  56. package/dist/render/md.js.map +1 -1
  57. package/dist/render/presentation.d.ts +4 -0
  58. package/dist/render/presentation.d.ts.map +1 -0
  59. package/dist/render/presentation.js +25 -0
  60. package/dist/render/presentation.js.map +1 -0
  61. package/dist/render/terminal.d.ts.map +1 -1
  62. package/dist/render/terminal.js +15 -1
  63. package/dist/render/terminal.js.map +1 -1
  64. package/dist/track/index.d.ts.map +1 -1
  65. package/dist/track/index.js +24 -10
  66. package/dist/track/index.js.map +1 -1
  67. package/dist/validation/evidence-bytes.d.ts +5 -0
  68. package/dist/validation/evidence-bytes.d.ts.map +1 -0
  69. package/dist/validation/evidence-bytes.js +57 -0
  70. package/dist/validation/evidence-bytes.js.map +1 -0
  71. package/dist/validation/evidence-shape.d.ts +12 -0
  72. package/dist/validation/evidence-shape.d.ts.map +1 -0
  73. package/dist/validation/evidence-shape.js +54 -0
  74. package/dist/validation/evidence-shape.js.map +1 -0
  75. package/dist/validation/evidence-sources.d.ts +7 -0
  76. package/dist/validation/evidence-sources.d.ts.map +1 -0
  77. package/dist/validation/evidence-sources.js +56 -0
  78. package/dist/validation/evidence-sources.js.map +1 -0
  79. package/dist/validation/evidence.d.ts +5 -0
  80. package/dist/validation/evidence.d.ts.map +1 -0
  81. package/dist/validation/evidence.js +131 -0
  82. package/dist/validation/evidence.js.map +1 -0
  83. package/dist/validation/index.d.ts +59 -0
  84. package/dist/validation/index.d.ts.map +1 -0
  85. package/dist/validation/index.js +500 -0
  86. package/dist/validation/index.js.map +1 -0
  87. package/dist/validation/readability.d.ts +28 -0
  88. package/dist/validation/readability.d.ts.map +1 -0
  89. package/dist/validation/readability.js +265 -0
  90. package/dist/validation/readability.js.map +1 -0
  91. package/package.json +36 -8
  92. package/registry/entries.v1.json +140 -0
  93. package/schemas/decision-dossier-document.v1.schema.json +193 -0
  94. package/schemas/decision-dossier-document.v2.schema.json +925 -0
  95. package/schemas/focus-edit-return.v1.schema.json +950 -0
  96. package/schemas/focus-editing-manifest.v1.schema.json +167 -0
  97. package/skills/focus/SKILL.md +181 -0
@@ -0,0 +1,509 @@
1
+ /**
2
+ * `@sentropic/focus/registry/definitions` — the publisher-owned definition
3
+ * surface for the `sentropic.focus` skill entry (contract §§3–4, R4).
4
+ *
5
+ * This module is SIDE-EFFECT-FREE: importing it reads no file, opens no
6
+ * handle and touches no network. The JSON manifest is read only when
7
+ * {@link loadFocusSkillDescriptor} is called; instruction text is read only
8
+ * through the caller-supplied loader in {@link resolveFocusPresentation},
9
+ * and only AFTER the presentation preflight succeeds — so an unavailable
10
+ * presentation refuses with `unsupported_presentation` with zero instruction
11
+ * loads.
12
+ */
13
+ import { createRequire } from "node:module";
14
+ import { createHash } from "node:crypto";
15
+ /** Canonical registry ID of the Focus skill. */
16
+ export const FOCUS_SKILL_ID = "sentropic.focus";
17
+ /** Public entry version of the first Focus registry release. */
18
+ export const FOCUS_ENTRY_VERSION = "2.0.0";
19
+ /** Entry-contract version this descriptor conforms to. */
20
+ export const FOCUS_CONTRACT_VERSION = "1.1.4";
21
+ /** Parameter-schema version of the Focus entry (contract §5.4). */
22
+ export const FOCUS_PARAMETERS_SCHEMA_VERSION = "1.0.0";
23
+ /** Existing skill-description limit enforced by the contract. */
24
+ export const MAX_SKILL_DESCRIPTION_LENGTH = 280;
25
+ /** Exact §5.4 defaults, applied once before validation. */
26
+ export const FOCUS_PARAMETER_DEFAULTS = {
27
+ mode: "snapshot",
28
+ preferredPresentation: "markdown",
29
+ locale: "en",
30
+ };
31
+ const definitionIssue = (path, code, message) => ({ path, code, message });
32
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
33
+ const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
34
+ const HEX64 = /^[0-9a-f]{64}$/;
35
+ /** Exact §5.4 parameter values pinned by entry 1.0.0 (closed: any drift refuses). */
36
+ const FOCUS_PRESENTATIONS = ["terminal", "markdown", "html", "mcp-app"];
37
+ const FOCUS_LOCALES = ["en", "fr"];
38
+ const FOCUS_PARAMETER_KEYS = ["mode", "preferredPresentation", "locale"];
39
+ const FOCUS_PARAMETERS_SCHEMA_ID = "urn:sentropic:registry:parameters:sentropic.focus:1.0.0";
40
+ const FOCUS_PARAMETERS_SCHEMA_DRAFT = "https://json-schema.org/draft/2020-12/schema";
41
+ /** Capability and schema references pinned by entry 1.0.0. */
42
+ const FOCUS_CAPABILITY_ID = "sentropic.focus.decision-dossier";
43
+ const FOCUS_DOSSIER_SCHEMA_ID = "urn:sentropic:focus:DecisionDossierDocument:1.0.0";
44
+ const FOCUS_DOSSIER_SCHEMA_VERSION = "1.0.0";
45
+ /** Authority, liaison and asset bindings pinned by entry 1.0.0 (closed). */
46
+ const FOCUS_PERMISSIONS = ["track.dossier.read"];
47
+ const FOCUS_CONTEXT_FILTERS = ["decision-dossier"];
48
+ const FOCUS_CATEGORY = "decision";
49
+ const FOCUS_SCHEMA_PROFILES = ["sentropic.parameters/2020-12-bounded-v1"];
50
+ const FOCUS_REQUIRED_HOST_FEATURES = [];
51
+ const FOCUS_OPTIONAL_HOST_FEATURES = ["terminal", "markdown", "html-sanitization", "mcp-app-ui"];
52
+ const FOCUS_TRACK_PEER_NAME = "@sentropic/track";
53
+ const FOCUS_TRACK_PEER_RANGE = "^0.98.6";
54
+ const FOCUS_INSTRUCTIONS_ASSET = "skills/focus/SKILL.md";
55
+ const FOCUS_SCHEMA_ASSET = "schemas/decision-dossier-document.v1.schema.json";
56
+ const FOCUS_EVIDENCE_ASSET = 'schemas/decision-dossier-document.v2.schema.json';
57
+ const FOCUS_EVIDENCE_ID = 'urn:sentropic:focus:DecisionDossierDocument:2.0.0';
58
+ const FOCUS_INSTRUCTIONS_ROLE = "skill-instructions";
59
+ const FOCUS_SCHEMA_ROLE = "document-schema";
60
+ const FOCUS_INSTRUCTIONS_MEDIA = "text/markdown";
61
+ const FOCUS_SCHEMA_MEDIA = "application/schema+json";
62
+ const sameStrings = (value, expected) => Array.isArray(value) &&
63
+ value.length === expected.length &&
64
+ value.every((item, index) => item === expected[index]);
65
+ const stringArray = (value, path, issues) => {
66
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
67
+ issues.push(definitionIssue(path, "invalid_parameters", "expected an array of strings"));
68
+ return undefined;
69
+ }
70
+ return value;
71
+ };
72
+ /**
73
+ * Closed validation of the publisher-owned Focus entry descriptor.
74
+ * Pure: no I/O, so catalog-time checks perform zero instruction reads.
75
+ */
76
+ export const validateFocusEntryDescriptor = (value) => {
77
+ const issues = [];
78
+ if (!isRecord(value)) {
79
+ return { ok: false, issues: [definitionIssue("$", "invalid_entry", "expected an object")] };
80
+ }
81
+ const at = (key) => `$.${key}`;
82
+ let valid = true;
83
+ const fail = (path, code, message) => {
84
+ issues.push(definitionIssue(path, code, message));
85
+ valid = false;
86
+ };
87
+ const rejectUnknownKeys = (record, allowed, basePath, ignore = []) => {
88
+ for (const key of Object.keys(record)) {
89
+ if (!allowed.includes(key) && !ignore.includes(key)) {
90
+ fail(`${basePath}.${key}`, "unknown_field", `unknown field "${key}"`);
91
+ }
92
+ }
93
+ };
94
+ rejectUnknownKeys(value, ["format", "contractVersion", "kind", "id", "name", "description", "entryVersion", "publisher", "compatibility", "parameters", "bindings", "assets", "skill"], "$",
95
+ // `mcp` keeps its dedicated arm diagnostic below (exactly one issue).
96
+ ["mcp"]);
97
+ if (value["format"] !== "sentropic.registry-entry/v1")
98
+ fail(at("format"), "invalid_entry", "expected sentropic.registry-entry/v1");
99
+ if (value["contractVersion"] !== FOCUS_CONTRACT_VERSION)
100
+ fail(at("contractVersion"), "incompatible_version", `expected ${FOCUS_CONTRACT_VERSION}`);
101
+ if (value["kind"] !== "skill")
102
+ fail(at("kind"), "invalid_entry", 'expected "skill"');
103
+ if (value["id"] !== FOCUS_SKILL_ID)
104
+ fail(at("id"), "invalid_entry", `expected "${FOCUS_SKILL_ID}"`);
105
+ if (value["name"] !== "focus")
106
+ fail(at("name"), "invalid_entry", 'expected name "focus"');
107
+ if (typeof value["description"] !== "string" || value["description"].length === 0) {
108
+ fail(at("description"), "invalid_entry", "expected a nonempty description");
109
+ }
110
+ else if (value["description"].length > MAX_SKILL_DESCRIPTION_LENGTH) {
111
+ fail(at("description"), "invalid_entry", `description exceeds ${MAX_SKILL_DESCRIPTION_LENGTH} characters`);
112
+ }
113
+ if (typeof value["entryVersion"] !== "string" || !SEMVER.test(value["entryVersion"])) {
114
+ fail(at("entryVersion"), "invalid_entry", "expected an exact SemVer entry version");
115
+ }
116
+ if (value["entryVersion"] !== FOCUS_ENTRY_VERSION)
117
+ fail(at("entryVersion"), "incompatible_version", `expected ${FOCUS_ENTRY_VERSION}`);
118
+ const publisher = value["publisher"];
119
+ if (!isRecord(publisher) ||
120
+ publisher["packageName"] !== "@sentropic/focus" ||
121
+ typeof publisher["packageVersion"] !== "string" ||
122
+ !SEMVER.test(publisher["packageVersion"])) {
123
+ fail(at("publisher"), "invalid_entry", "expected the @sentropic/focus package identity with an exact version");
124
+ }
125
+ if (isRecord(publisher)) {
126
+ rejectUnknownKeys(publisher, ["packageName", "packageVersion"], at("publisher"));
127
+ }
128
+ const compatibility = value["compatibility"];
129
+ if (!isRecord(compatibility) || compatibility["entryContract"] !== FOCUS_CONTRACT_VERSION) {
130
+ fail(at("compatibility"), "incompatible_version", "expected the pinned entry-contract version");
131
+ }
132
+ else {
133
+ rejectUnknownKeys(compatibility, ["entryContract", "packages", "schemaProfiles", "requiredHostFeatures", "optionalHostFeatures"], at("compatibility"));
134
+ const packages = compatibility["packages"];
135
+ if (!Array.isArray(packages) ||
136
+ packages.length !== 1 ||
137
+ !isRecord(packages[0]) ||
138
+ packages[0]["name"] !== FOCUS_TRACK_PEER_NAME ||
139
+ packages[0]["range"] !== FOCUS_TRACK_PEER_RANGE ||
140
+ Object.keys(packages[0]).length !== 2) {
141
+ fail("$.compatibility.packages", "invalid_entry", "expected exactly the pinned @sentropic/track peer");
142
+ }
143
+ const profiles = stringArray(compatibility["schemaProfiles"], "$.compatibility.schemaProfiles", issues);
144
+ if (profiles === undefined)
145
+ valid = false;
146
+ else if (!sameStrings(profiles, [...FOCUS_SCHEMA_PROFILES])) {
147
+ fail("$.compatibility.schemaProfiles", "unsupported_schema_profile", "expected exactly the bounded parameters profile");
148
+ }
149
+ const requiredFeatures = stringArray(compatibility["requiredHostFeatures"], "$.compatibility.requiredHostFeatures", issues);
150
+ if (requiredFeatures === undefined)
151
+ valid = false;
152
+ else if (!sameStrings(requiredFeatures, [...FOCUS_REQUIRED_HOST_FEATURES])) {
153
+ fail("$.compatibility.requiredHostFeatures", "unsupported_host_feature", "unknown required host feature");
154
+ }
155
+ const optionalFeatures = stringArray(compatibility["optionalHostFeatures"], "$.compatibility.optionalHostFeatures", issues);
156
+ if (optionalFeatures === undefined)
157
+ valid = false;
158
+ else if (!sameStrings(optionalFeatures, [...FOCUS_OPTIONAL_HOST_FEATURES])) {
159
+ fail("$.compatibility.optionalHostFeatures", "invalid_entry", "expected exactly the pinned optional host features");
160
+ }
161
+ }
162
+ const parameters = value["parameters"];
163
+ if (!isRecord(parameters) || parameters["schemaVersion"] !== FOCUS_PARAMETERS_SCHEMA_VERSION) {
164
+ fail(at("parameters"), "unsupported_schema_profile", `expected parameter schema version ${FOCUS_PARAMETERS_SCHEMA_VERSION}`);
165
+ }
166
+ else {
167
+ rejectUnknownKeys(parameters, ["schemaVersion", "schema", "defaults"], at("parameters"));
168
+ const schema = parameters["schema"];
169
+ if (!isRecord(schema)) {
170
+ fail("$.parameters.schema", "unsupported_schema_profile", "expected a schema object");
171
+ }
172
+ else {
173
+ rejectUnknownKeys(schema, ["$schema", "$id", "type", "additionalProperties", "required", "properties"], "$.parameters.schema");
174
+ if (schema["$schema"] !== FOCUS_PARAMETERS_SCHEMA_DRAFT) {
175
+ fail("$.parameters.schema.$schema", "unsupported_schema_profile", `expected ${FOCUS_PARAMETERS_SCHEMA_DRAFT}`);
176
+ }
177
+ if (schema["$id"] !== FOCUS_PARAMETERS_SCHEMA_ID) {
178
+ fail("$.parameters.schema.$id", "unsupported_schema_profile", `expected ${FOCUS_PARAMETERS_SCHEMA_ID}`);
179
+ }
180
+ const properties = schema["properties"];
181
+ if (schema["type"] !== "object" ||
182
+ schema["additionalProperties"] !== false ||
183
+ !sameStrings(schema["required"], [...FOCUS_PARAMETER_KEYS]) ||
184
+ !isRecord(properties)) {
185
+ fail("$.parameters.schema", "unsupported_schema_profile", "expected the exact §5.4 focus parameter shape");
186
+ }
187
+ else {
188
+ rejectUnknownKeys(properties, [...FOCUS_PARAMETER_KEYS], "$.parameters.schema.properties");
189
+ const mode = properties["mode"];
190
+ const preferredPresentation = properties["preferredPresentation"];
191
+ const locale = properties["locale"];
192
+ if (!isRecord(mode) ||
193
+ Object.keys(mode).length !== 1 ||
194
+ mode["const"] !== "snapshot" ||
195
+ !isRecord(preferredPresentation) ||
196
+ Object.keys(preferredPresentation).length !== 1 ||
197
+ !sameStrings(preferredPresentation["enum"], [...FOCUS_PRESENTATIONS]) ||
198
+ !isRecord(locale) ||
199
+ Object.keys(locale).length !== 1 ||
200
+ !sameStrings(locale["enum"], [...FOCUS_LOCALES])) {
201
+ fail("$.parameters.schema", "unsupported_schema_profile", "expected the exact §5.4 focus parameter shape");
202
+ }
203
+ }
204
+ }
205
+ const defaults = parameters["defaults"];
206
+ if (!isRecord(defaults) ||
207
+ defaults["mode"] !== FOCUS_PARAMETER_DEFAULTS.mode ||
208
+ defaults["preferredPresentation"] !== FOCUS_PARAMETER_DEFAULTS.preferredPresentation ||
209
+ defaults["locale"] !== FOCUS_PARAMETER_DEFAULTS.locale) {
210
+ fail("$.parameters.defaults", "invalid_parameters", "expected the exact §5.4 defaults");
211
+ }
212
+ else {
213
+ rejectUnknownKeys(defaults, [...FOCUS_PARAMETER_KEYS], "$.parameters.defaults");
214
+ }
215
+ }
216
+ if (!Array.isArray(value["bindings"]) || value["bindings"].length !== 0) {
217
+ fail(at("bindings"), "invalid_entry", "instruction-only entries carry no bindings");
218
+ }
219
+ const assets = value["assets"];
220
+ if (!Array.isArray(assets) || assets.length !== 3) {
221
+ fail(at("assets"), "invalid_entry", "expected exactly the instructions and two versioned schema assets");
222
+ }
223
+ else {
224
+ const expectedAssets = [
225
+ { role: FOCUS_INSTRUCTIONS_ROLE, path: FOCUS_INSTRUCTIONS_ASSET, mediaType: FOCUS_INSTRUCTIONS_MEDIA },
226
+ { role: FOCUS_SCHEMA_ROLE, path: FOCUS_SCHEMA_ASSET, mediaType: FOCUS_SCHEMA_MEDIA },
227
+ { role: FOCUS_SCHEMA_ROLE, path: FOCUS_EVIDENCE_ASSET, mediaType: FOCUS_SCHEMA_MEDIA },
228
+ ];
229
+ assets.forEach((asset, index) => {
230
+ const path = `$.assets[${index}]`;
231
+ const expected = expectedAssets[index];
232
+ if (!isRecord(asset) ||
233
+ asset["role"] !== expected.role ||
234
+ asset["path"] !== expected.path ||
235
+ asset["mediaType"] !== expected.mediaType ||
236
+ typeof asset["sha256"] !== "string" ||
237
+ !HEX64.test(asset["sha256"])) {
238
+ fail(path, "invalid_entry", "expected the pinned asset role, path, mediaType and SHA-256 digest");
239
+ }
240
+ else {
241
+ rejectUnknownKeys(asset, ["role", "path", "mediaType", "sha256"], path);
242
+ }
243
+ });
244
+ }
245
+ if (Array.isArray(assets) &&
246
+ assets.every((asset) => isRecord(asset) && typeof asset["path"] === "string")) {
247
+ for (const safeIssue of assertSafeAssetPaths({ assets: assets })) {
248
+ issues.push(safeIssue);
249
+ valid = false;
250
+ }
251
+ }
252
+ const declaredAssetPaths = new Set(Array.isArray(assets)
253
+ ? assets
254
+ .filter((asset) => isRecord(asset))
255
+ .map((asset) => asset["path"])
256
+ .filter((path) => typeof path === "string")
257
+ : []);
258
+ const skill = value["skill"];
259
+ if (!isRecord(skill) || value["mcp"] !== undefined) {
260
+ fail(at("skill"), "invalid_entry", "expected exactly the skill payload (no mcp arm)");
261
+ }
262
+ else {
263
+ rejectUnknownKeys(skill, ["profile", "metadata", "instructionsAsset", "capabilities", "tools", "documentSchemas", "dependencies"], at("skill"));
264
+ if (skill["profile"] !== "instructions")
265
+ fail("$.skill.profile", "invalid_entry", 'expected the instruction-only profile');
266
+ const metadata = skill["metadata"];
267
+ if (!isRecord(metadata) ||
268
+ metadata["category"] !== FOCUS_CATEGORY ||
269
+ !Array.isArray(metadata["toolNames"]) ||
270
+ metadata["toolNames"].length !== 0) {
271
+ fail("$.skill.metadata", "invalid_entry", "expected decision metadata with empty toolNames");
272
+ }
273
+ else {
274
+ rejectUnknownKeys(metadata, ["category", "contextFilters", "permissions", "toolNames"], "$.skill.metadata");
275
+ const contextFilters = stringArray(metadata["contextFilters"], "$.skill.metadata.contextFilters", issues);
276
+ if (contextFilters === undefined)
277
+ valid = false;
278
+ else if (!sameStrings(contextFilters, [...FOCUS_CONTEXT_FILTERS])) {
279
+ fail("$.skill.metadata.contextFilters", "invalid_entry", "expected exactly the pinned context filters");
280
+ }
281
+ const metadataPermissions = stringArray(metadata["permissions"], "$.skill.metadata.permissions", issues);
282
+ if (metadataPermissions === undefined)
283
+ valid = false;
284
+ else if (!sameStrings(metadataPermissions, [...FOCUS_PERMISSIONS])) {
285
+ fail("$.skill.metadata.permissions", "invalid_entry", "expected exactly the read-only dossier permission");
286
+ }
287
+ }
288
+ if (skill["instructionsAsset"] !== FOCUS_INSTRUCTIONS_ASSET) {
289
+ fail("$.skill.instructionsAsset", "invalid_entry", "expected the pinned SKILL.md asset path");
290
+ }
291
+ else if (!declaredAssetPaths.has(skill["instructionsAsset"])) {
292
+ fail("$.skill.instructionsAsset", "invalid_entry", "instruction asset is not a declared entry asset");
293
+ }
294
+ const capabilities = skill["capabilities"];
295
+ if (!Array.isArray(capabilities) || capabilities.length !== 1) {
296
+ fail("$.skill.capabilities", "invalid_entry", `expected exactly the read-only ${FOCUS_CAPABILITY_ID} capability`);
297
+ }
298
+ else {
299
+ const capability = capabilities[0];
300
+ if (!isRecord(capability) ||
301
+ capability["id"] !== FOCUS_CAPABILITY_ID ||
302
+ capability["effect"] !== "read-only") {
303
+ fail("$.skill.capabilities", "invalid_entry", `expected exactly the read-only ${FOCUS_CAPABILITY_ID} capability`);
304
+ }
305
+ else {
306
+ rejectUnknownKeys(capability, ["id", "description", "effect", "permissions", "inputSchemaRef", "outputSchemaRef"], "$.skill.capabilities[0]");
307
+ const capabilityPermissions = stringArray(capability["permissions"], "$.skill.capabilities[0].permissions", issues);
308
+ if (typeof capability["description"] !== "string" ||
309
+ capability["description"].length === 0 ||
310
+ capabilityPermissions === undefined ||
311
+ !sameStrings(capabilityPermissions, [...FOCUS_PERMISSIONS])) {
312
+ if (typeof capability["description"] !== "string" || capability["description"].length === 0) {
313
+ fail("$.skill.capabilities[0].description", "invalid_entry", "expected a nonempty capability description");
314
+ }
315
+ if (capabilityPermissions !== undefined && !sameStrings(capabilityPermissions, [...FOCUS_PERMISSIONS])) {
316
+ fail("$.skill.capabilities[0].permissions", "invalid_entry", "expected exactly the read-only dossier permission");
317
+ }
318
+ valid = false;
319
+ }
320
+ if (capability["inputSchemaRef"] !== FOCUS_EVIDENCE_ID ||
321
+ capability["outputSchemaRef"] !== FOCUS_EVIDENCE_ID) {
322
+ fail("$.skill.capabilities[0]", "invalid_entry", `expected schema refs bound to ${FOCUS_EVIDENCE_ID}`);
323
+ }
324
+ }
325
+ }
326
+ if (!Array.isArray(skill["tools"]) || skill["tools"].length !== 0) {
327
+ fail("$.skill.tools", "invalid_entry", "instruction-only entries carry no tools");
328
+ }
329
+ const schemas = skill["documentSchemas"];
330
+ if (!Array.isArray(schemas) || schemas.length !== 2) {
331
+ fail("$.skill.documentSchemas", "invalid_entry", "expected both digest-bound dossier schema versions");
332
+ }
333
+ else {
334
+ schemas.forEach((schema, index) => {
335
+ const schemaId = index === 0 ? FOCUS_DOSSIER_SCHEMA_ID : FOCUS_EVIDENCE_ID;
336
+ const version = index === 0 ? FOCUS_DOSSIER_SCHEMA_VERSION : '2.0.0';
337
+ const assetPath = index === 0 ? FOCUS_SCHEMA_ASSET : FOCUS_EVIDENCE_ASSET;
338
+ const schemaPath = `$.skill.documentSchemas[${index}]`;
339
+ if (!isRecord(schema) ||
340
+ schema["name"] !== "DecisionDossierDocument" ||
341
+ schema["schemaId"] !== schemaId ||
342
+ schema["version"] !== version ||
343
+ typeof schema["assetPath"] !== "string" ||
344
+ typeof schema["sha256"] !== "string" ||
345
+ !HEX64.test(schema["sha256"])) {
346
+ fail("$.skill.documentSchemas", "invalid_entry", "expected exactly the digest-bound DecisionDossierDocument schema reference");
347
+ }
348
+ else {
349
+ rejectUnknownKeys(schema, ["name", "schemaId", "version", "assetPath", "sha256"], schemaPath);
350
+ if (schema["assetPath"] !== assetPath) {
351
+ fail(`${schemaPath}.assetPath`, "invalid_entry", "expected the pinned schema asset path");
352
+ }
353
+ else if (!declaredAssetPaths.has(schema["assetPath"])) {
354
+ fail(`${schemaPath}.assetPath`, "invalid_entry", "schema asset is not a declared entry asset");
355
+ }
356
+ else if (Array.isArray(assets)) {
357
+ const pinned = assets.find((asset) => isRecord(asset) && asset["path"] === assetPath);
358
+ if (!isRecord(pinned) ||
359
+ pinned["sha256"] !== schema["sha256"] ||
360
+ pinned["role"] !== FOCUS_SCHEMA_ROLE) {
361
+ fail(`${schemaPath}.sha256`, "integrity_mismatch", "schema digest must match the pinned asset digest");
362
+ }
363
+ }
364
+ }
365
+ });
366
+ }
367
+ if (!Array.isArray(skill["dependencies"]) || skill["dependencies"].length !== 0) {
368
+ fail("$.skill.dependencies", "invalid_entry", "instruction-only entries carry no dependencies");
369
+ }
370
+ }
371
+ if (!valid)
372
+ return { ok: false, issues };
373
+ return { ok: true, value: value };
374
+ };
375
+ /**
376
+ * Validate Focus configuration values against the exact §5.4 profile.
377
+ * Declared defaults apply once before validation; unknown keys refuse.
378
+ */
379
+ export const validateFocusParameters = (value) => {
380
+ const issues = [];
381
+ const merged = value === undefined ? {} : isRecord(value) ? { ...value } : {};
382
+ if (value !== undefined && !isRecord(value)) {
383
+ return { ok: false, issues: [definitionIssue("$", "invalid_parameters", "expected an object")] };
384
+ }
385
+ for (const [key, fallback] of Object.entries(FOCUS_PARAMETER_DEFAULTS)) {
386
+ if (merged[key] === undefined)
387
+ merged[key] = fallback;
388
+ }
389
+ for (const key of Object.keys(merged)) {
390
+ if (!(key in FOCUS_PARAMETER_DEFAULTS)) {
391
+ issues.push(definitionIssue(`$.${key}`, "invalid_parameters", "unknown parameter"));
392
+ }
393
+ }
394
+ if (merged["mode"] !== "snapshot") {
395
+ issues.push(definitionIssue("$.mode", "invalid_parameters", 'mode is fixed to "snapshot"'));
396
+ }
397
+ const presentations = ["terminal", "markdown", "html", "mcp-app"];
398
+ if (typeof merged["preferredPresentation"] !== "string" || !presentations.includes(merged["preferredPresentation"])) {
399
+ issues.push(definitionIssue("$.preferredPresentation", "invalid_parameters", `expected one of: ${presentations.join(" | ")}`));
400
+ }
401
+ if (merged["locale"] !== "en" && merged["locale"] !== "fr") {
402
+ issues.push(definitionIssue("$.locale", "invalid_parameters", 'expected "en" or "fr"'));
403
+ }
404
+ if (issues.length > 0)
405
+ return { ok: false, issues };
406
+ return {
407
+ ok: true,
408
+ value: {
409
+ mode: "snapshot",
410
+ preferredPresentation: merged["preferredPresentation"],
411
+ locale: merged["locale"],
412
+ },
413
+ };
414
+ };
415
+ /**
416
+ * Presentation preflight for the selected Focus configuration.
417
+ * `loadInstructions` runs ONLY when the requested presentation is usable, so
418
+ * an unavailable `mcp-app` (or an unsanitized `html`) refuses with
419
+ * `unsupported_presentation` with zero instruction reads/loads.
420
+ */
421
+ export const resolveFocusPresentation = (params, gate, loadInstructions) => {
422
+ switch (params.preferredPresentation) {
423
+ case "terminal":
424
+ case "markdown":
425
+ return { ok: true, instructions: loadInstructions() };
426
+ case "html":
427
+ if (!gate.htmlSanitizerAvailable) {
428
+ return {
429
+ ok: false,
430
+ code: "unsupported_presentation",
431
+ message: "html presentation requires the host sanitization hook",
432
+ };
433
+ }
434
+ return { ok: true, instructions: loadInstructions() };
435
+ case "mcp-app":
436
+ if (!gate.uiRegistered || !gate.uiSelected || !gate.uiQualified) {
437
+ return {
438
+ ok: false,
439
+ code: "unsupported_presentation",
440
+ message: "mcp-app presentation requires the separately registered, selected and qualified UI entry",
441
+ };
442
+ }
443
+ return { ok: true, instructions: loadInstructions() };
444
+ }
445
+ };
446
+ const packageRequire = createRequire(import.meta.url);
447
+ /**
448
+ * Read the package-owned registry manifest (`registry/entries.v1.json`).
449
+ * Called explicitly by the host; importing this module alone reads nothing.
450
+ *
451
+ * The compiled snapshot vendored into `@sentropic/track`
452
+ * (`packages/track/src/focus-vendor/registry/entries.v1.json`) ships the
453
+ * pinned 1.0.0 manifest alongside the compiled helper, so the vendor never
454
+ * resolves a foreign `@sentropic/focus` copy: package layout first,
455
+ * vendor-adjacent manifest second, and no cross-package fallback.
456
+ */
457
+ export const loadFocusSkillDescriptor = () => {
458
+ try {
459
+ return packageRequire("../../registry/entries.v1.json");
460
+ }
461
+ catch {
462
+ return packageRequire("./entries.v1.json");
463
+ }
464
+ };
465
+ /** Recompute every asset/schema digest over the supplied bytes. */
466
+ export const verifyAssetDigests = (entry, readFile) => {
467
+ const issues = [];
468
+ const digestOf = (bytes) => createHash("sha256").update(bytes).digest("hex");
469
+ for (const asset of entry.assets) {
470
+ const bytes = readFile(asset.path);
471
+ if (bytes === null) {
472
+ issues.push(definitionIssue(`asset:${asset.path}`, "invalid_entry", "asset missing from the package"));
473
+ }
474
+ else if (digestOf(bytes) !== asset.sha256) {
475
+ issues.push(definitionIssue(`asset:${asset.path}`, "integrity_mismatch", "asset bytes do not match the entry digest"));
476
+ }
477
+ }
478
+ for (const schema of entry.skill.documentSchemas) {
479
+ const bytes = readFile(schema.assetPath);
480
+ if (bytes === null) {
481
+ issues.push(definitionIssue(`asset:${schema.assetPath}`, "invalid_entry", "schema asset missing from the package"));
482
+ }
483
+ else if (digestOf(bytes) !== schema.sha256) {
484
+ issues.push(definitionIssue(`asset:${schema.assetPath}`, "integrity_mismatch", "schema bytes do not match the entry digest"));
485
+ }
486
+ }
487
+ return issues;
488
+ };
489
+ /** Refuse absolute paths, traversal, escapes and duplicates. */
490
+ export const assertSafeAssetPaths = (entry) => {
491
+ const issues = [];
492
+ const seen = new Set();
493
+ for (const asset of entry.assets) {
494
+ const path = asset.path;
495
+ const segments = path.split("/");
496
+ if (path.length === 0 ||
497
+ path.startsWith("/") ||
498
+ path.includes("\\") ||
499
+ segments.some((segment) => segment === "" || segment === "." || segment === "..")) {
500
+ issues.push(definitionIssue(`asset:${path}`, "path_escape", "asset path must be a clean package-relative POSIX path"));
501
+ }
502
+ if (seen.has(path)) {
503
+ issues.push(definitionIssue(`asset:${path}`, "duplicate_entry", "asset path listed twice"));
504
+ }
505
+ seen.add(path);
506
+ }
507
+ return issues;
508
+ };
509
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/registry/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DecisionDossierDocument } from '../model.js';
2
+ /** Disclosed estimate at six UTF-8 bytes per word; raw consultation is not decision time. */
3
+ export declare function evidenceVolume(doc: DecisionDossierDocument): {
4
+ sources: number;
5
+ bytes: number;
6
+ consultationMinutes: number;
7
+ };
8
+ /** All exports retain an evidence index; full raw bytes remain in the portable envelope. */
9
+ export declare function evidenceIndex(doc: DecisionDossierDocument): string;
10
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/render/evidence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,GAAG,EAAE,uBAAuB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAM5H;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,GAAG,EAAE,uBAAuB,GAAG,MAAM,CAelE"}
@@ -0,0 +1,37 @@
1
+ import { isEvidenceDossier } from '../model.js';
2
+ /** Disclosed estimate at six UTF-8 bytes per word; raw consultation is not decision time. */
3
+ export function evidenceVolume(doc) {
4
+ if (!isEvidenceDossier(doc))
5
+ return { sources: 0, bytes: 0, consultationMinutes: 0 };
6
+ const bytes = doc.sources.reduce((n, s) => n + s.size, 0);
7
+ const textBytes = doc.sources.filter(s => !s.mediaType.startsWith('image/')).reduce((n, s) => n + s.size, 0)
8
+ + doc.annexes.reduce((n, a) => n + new TextEncoder().encode(JSON.stringify(a.blocks)).length, 0);
9
+ return { sources: doc.sources.length, bytes, consultationMinutes: Math.ceil(textBytes / 6 / 180) };
10
+ }
11
+ /** All exports retain an evidence index; full raw bytes remain in the portable envelope. */
12
+ export function evidenceIndex(doc) {
13
+ if (!isEvidenceDossier(doc))
14
+ return '';
15
+ const v = evidenceVolume(doc);
16
+ const lines = [`Evidence: ${v.sources} sources · ${v.bytes} bytes · estimated consultation ${v.consultationMinutes} min (6 bytes/word)`,
17
+ 'Raw supporting detail is separate from the primary reading budget.'];
18
+ for (const s of doc.sources)
19
+ lines.push(`Source ${s.id}: ${s.title} · ${s.mediaType} · ${s.size} bytes · SHA-256 ${s.sha256} · ${JSON.stringify(s.origin)}`);
20
+ for (const c of doc.citations)
21
+ lines.push(`Citation ${c.id}: ${c.label} → ${c.sourceId}:${c.locator.kind === 'lines' ? `${c.locator.start}–${c.locator.end}` : c.locator.caption}`);
22
+ for (const s of doc.sections) {
23
+ if (s.citationRefs?.length)
24
+ lines.push(`${s.id} → ${s.citationRefs.join(', ')}`);
25
+ if (s.kind === 'optionSet')
26
+ for (const o of s.options)
27
+ if (o.citationRefs?.length)
28
+ lines.push(`${o.id} → ${o.citationRefs.join(', ')}`);
29
+ }
30
+ for (const g of doc.evidenceGroups)
31
+ lines.push(`${g.id}: ${g.summary} → ${[...g.citationRefs, ...g.sourceRefs].join(', ')}`);
32
+ for (const a of doc.annexes)
33
+ lines.push(`Annex ${a.id}: ${a.title} — ${a.summary} · ${a.blocks.length} support blocks · back: ${a.backRefs.join(', ')}`);
34
+ lines.push('Full embedded evidence consultation/download requires the portable HTML renderer.');
35
+ return lines.join('\n');
36
+ }
37
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/render/evidence.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAGV,uBAAuB,EAExB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2FlD,qEAAqE;AACrE,eAAO,MAAM,UAAU,QAChB,uBAAuB,SACrB,eAAe,KACrB,MAkBF,CAAC"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAGV,uBAAuB,EAExB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA6FlD,qEAAqE;AACrE,eAAO,MAAM,UAAU,GACrB,KAAK,uBAAuB,EAC5B,OAAO,eAAe,KACrB,MAyBF,CAAC"}