@rejot-dev/thalo 0.0.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/LICENSE +21 -0
- package/README.md +396 -0
- package/dist/ast/ast-types.d.ts +469 -0
- package/dist/ast/ast-types.d.ts.map +1 -0
- package/dist/ast/ast-types.js +11 -0
- package/dist/ast/ast-types.js.map +1 -0
- package/dist/ast/builder.js +158 -0
- package/dist/ast/builder.js.map +1 -0
- package/dist/ast/extract.js +748 -0
- package/dist/ast/extract.js.map +1 -0
- package/dist/ast/node-at-position.d.ts +147 -0
- package/dist/ast/node-at-position.d.ts.map +1 -0
- package/dist/ast/node-at-position.js +382 -0
- package/dist/ast/node-at-position.js.map +1 -0
- package/dist/ast/visitor.js +232 -0
- package/dist/ast/visitor.js.map +1 -0
- package/dist/checker/check.d.ts +53 -0
- package/dist/checker/check.d.ts.map +1 -0
- package/dist/checker/check.js +105 -0
- package/dist/checker/check.js.map +1 -0
- package/dist/checker/rules/actualize-missing-updated.js +34 -0
- package/dist/checker/rules/actualize-missing-updated.js.map +1 -0
- package/dist/checker/rules/actualize-unresolved-target.js +42 -0
- package/dist/checker/rules/actualize-unresolved-target.js.map +1 -0
- package/dist/checker/rules/alter-before-define.js +53 -0
- package/dist/checker/rules/alter-before-define.js.map +1 -0
- package/dist/checker/rules/alter-undefined-entity.js +32 -0
- package/dist/checker/rules/alter-undefined-entity.js.map +1 -0
- package/dist/checker/rules/create-requires-section.js +34 -0
- package/dist/checker/rules/create-requires-section.js.map +1 -0
- package/dist/checker/rules/define-entity-requires-section.js +31 -0
- package/dist/checker/rules/define-entity-requires-section.js.map +1 -0
- package/dist/checker/rules/duplicate-entity-definition.js +37 -0
- package/dist/checker/rules/duplicate-entity-definition.js.map +1 -0
- package/dist/checker/rules/duplicate-field-in-schema.js +38 -0
- package/dist/checker/rules/duplicate-field-in-schema.js.map +1 -0
- package/dist/checker/rules/duplicate-link-id.js +52 -0
- package/dist/checker/rules/duplicate-link-id.js.map +1 -0
- package/dist/checker/rules/duplicate-metadata-key.js +21 -0
- package/dist/checker/rules/duplicate-metadata-key.js.map +1 -0
- package/dist/checker/rules/duplicate-section-heading.js +41 -0
- package/dist/checker/rules/duplicate-section-heading.js.map +1 -0
- package/dist/checker/rules/duplicate-section-in-schema.js +38 -0
- package/dist/checker/rules/duplicate-section-in-schema.js.map +1 -0
- package/dist/checker/rules/duplicate-timestamp.js +104 -0
- package/dist/checker/rules/duplicate-timestamp.js.map +1 -0
- package/dist/checker/rules/empty-required-value.js +45 -0
- package/dist/checker/rules/empty-required-value.js.map +1 -0
- package/dist/checker/rules/empty-section.js +21 -0
- package/dist/checker/rules/empty-section.js.map +1 -0
- package/dist/checker/rules/invalid-date-range-value.js +56 -0
- package/dist/checker/rules/invalid-date-range-value.js.map +1 -0
- package/dist/checker/rules/invalid-default-value.js +86 -0
- package/dist/checker/rules/invalid-default-value.js.map +1 -0
- package/dist/checker/rules/invalid-field-type.js +45 -0
- package/dist/checker/rules/invalid-field-type.js.map +1 -0
- package/dist/checker/rules/missing-required-field.js +48 -0
- package/dist/checker/rules/missing-required-field.js.map +1 -0
- package/dist/checker/rules/missing-required-section.js +51 -0
- package/dist/checker/rules/missing-required-section.js.map +1 -0
- package/dist/checker/rules/missing-title.js +56 -0
- package/dist/checker/rules/missing-title.js.map +1 -0
- package/dist/checker/rules/remove-undefined-field.js +42 -0
- package/dist/checker/rules/remove-undefined-field.js.map +1 -0
- package/dist/checker/rules/remove-undefined-section.js +42 -0
- package/dist/checker/rules/remove-undefined-section.js.map +1 -0
- package/dist/checker/rules/rules.d.ts +71 -0
- package/dist/checker/rules/rules.d.ts.map +1 -0
- package/dist/checker/rules/rules.js +102 -0
- package/dist/checker/rules/rules.js.map +1 -0
- package/dist/checker/rules/synthesis-empty-query.js +35 -0
- package/dist/checker/rules/synthesis-empty-query.js.map +1 -0
- package/dist/checker/rules/synthesis-missing-prompt.js +42 -0
- package/dist/checker/rules/synthesis-missing-prompt.js.map +1 -0
- package/dist/checker/rules/synthesis-missing-sources.js +32 -0
- package/dist/checker/rules/synthesis-missing-sources.js.map +1 -0
- package/dist/checker/rules/synthesis-unknown-query-entity.js +39 -0
- package/dist/checker/rules/synthesis-unknown-query-entity.js.map +1 -0
- package/dist/checker/rules/timestamp-out-of-order.js +55 -0
- package/dist/checker/rules/timestamp-out-of-order.js.map +1 -0
- package/dist/checker/rules/unknown-entity.js +32 -0
- package/dist/checker/rules/unknown-entity.js.map +1 -0
- package/dist/checker/rules/unknown-field.js +40 -0
- package/dist/checker/rules/unknown-field.js.map +1 -0
- package/dist/checker/rules/unknown-section.js +47 -0
- package/dist/checker/rules/unknown-section.js.map +1 -0
- package/dist/checker/rules/unresolved-link.js +34 -0
- package/dist/checker/rules/unresolved-link.js.map +1 -0
- package/dist/checker/rules/update-without-create.js +65 -0
- package/dist/checker/rules/update-without-create.js.map +1 -0
- package/dist/checker/visitor.d.ts +69 -0
- package/dist/checker/visitor.d.ts.map +1 -0
- package/dist/checker/visitor.js +67 -0
- package/dist/checker/visitor.js.map +1 -0
- package/dist/checker/workspace-index.d.ts +50 -0
- package/dist/checker/workspace-index.d.ts.map +1 -0
- package/dist/checker/workspace-index.js +108 -0
- package/dist/checker/workspace-index.js.map +1 -0
- package/dist/commands/actualize.d.ts +113 -0
- package/dist/commands/actualize.d.ts.map +1 -0
- package/dist/commands/actualize.js +111 -0
- package/dist/commands/actualize.js.map +1 -0
- package/dist/commands/check.d.ts +65 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +61 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/format.d.ts +90 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +80 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/query.d.ts +152 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +151 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/constants.d.ts +31 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +51 -0
- package/dist/constants.js.map +1 -0
- package/dist/files.d.ts +58 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +103 -0
- package/dist/files.js.map +1 -0
- package/dist/formatters.d.ts +39 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +200 -0
- package/dist/formatters.js.map +1 -0
- package/dist/fragment.d.ts +22 -0
- package/dist/fragment.d.ts.map +1 -0
- package/dist/git/git.js +240 -0
- package/dist/git/git.js.map +1 -0
- package/dist/merge/conflict-detector.d.ts +89 -0
- package/dist/merge/conflict-detector.d.ts.map +1 -0
- package/dist/merge/conflict-detector.js +352 -0
- package/dist/merge/conflict-detector.js.map +1 -0
- package/dist/merge/conflict-formatter.js +143 -0
- package/dist/merge/conflict-formatter.js.map +1 -0
- package/dist/merge/driver.d.ts +54 -0
- package/dist/merge/driver.d.ts.map +1 -0
- package/dist/merge/driver.js +112 -0
- package/dist/merge/driver.js.map +1 -0
- package/dist/merge/entry-matcher.d.ts +50 -0
- package/dist/merge/entry-matcher.d.ts.map +1 -0
- package/dist/merge/entry-matcher.js +141 -0
- package/dist/merge/entry-matcher.js.map +1 -0
- package/dist/merge/entry-merger.js +194 -0
- package/dist/merge/entry-merger.js.map +1 -0
- package/dist/merge/merge-result-builder.d.ts +62 -0
- package/dist/merge/merge-result-builder.d.ts.map +1 -0
- package/dist/merge/merge-result-builder.js +89 -0
- package/dist/merge/merge-result-builder.js.map +1 -0
- package/dist/mod.d.ts +31 -0
- package/dist/mod.js +23 -0
- package/dist/model/document.d.ts +134 -0
- package/dist/model/document.d.ts.map +1 -0
- package/dist/model/document.js +275 -0
- package/dist/model/document.js.map +1 -0
- package/dist/model/line-index.d.ts +85 -0
- package/dist/model/line-index.d.ts.map +1 -0
- package/dist/model/line-index.js +159 -0
- package/dist/model/line-index.js.map +1 -0
- package/dist/model/workspace.d.ts +296 -0
- package/dist/model/workspace.d.ts.map +1 -0
- package/dist/model/workspace.js +562 -0
- package/dist/model/workspace.js.map +1 -0
- package/dist/parser.js +27 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.native.d.ts +51 -0
- package/dist/parser.native.d.ts.map +1 -0
- package/dist/parser.native.js +62 -0
- package/dist/parser.native.js.map +1 -0
- package/dist/parser.shared.d.ts +99 -0
- package/dist/parser.shared.d.ts.map +1 -0
- package/dist/parser.shared.js +124 -0
- package/dist/parser.shared.js.map +1 -0
- package/dist/parser.web.d.ts +67 -0
- package/dist/parser.web.d.ts.map +1 -0
- package/dist/parser.web.js +49 -0
- package/dist/parser.web.js.map +1 -0
- package/dist/schema/registry.d.ts +108 -0
- package/dist/schema/registry.d.ts.map +1 -0
- package/dist/schema/registry.js +281 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/semantic/analyzer.d.ts +107 -0
- package/dist/semantic/analyzer.d.ts.map +1 -0
- package/dist/semantic/analyzer.js +261 -0
- package/dist/semantic/analyzer.js.map +1 -0
- package/dist/services/change-tracker/change-tracker.d.ts +111 -0
- package/dist/services/change-tracker/change-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/change-tracker.js +62 -0
- package/dist/services/change-tracker/change-tracker.js.map +1 -0
- package/dist/services/change-tracker/create-tracker.d.ts +42 -0
- package/dist/services/change-tracker/create-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/create-tracker.js +53 -0
- package/dist/services/change-tracker/create-tracker.js.map +1 -0
- package/dist/services/change-tracker/git-tracker.d.ts +59 -0
- package/dist/services/change-tracker/git-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/git-tracker.js +218 -0
- package/dist/services/change-tracker/git-tracker.js.map +1 -0
- package/dist/services/change-tracker/timestamp-tracker.d.ts +22 -0
- package/dist/services/change-tracker/timestamp-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/timestamp-tracker.js +74 -0
- package/dist/services/change-tracker/timestamp-tracker.js.map +1 -0
- package/dist/services/definition.d.ts +37 -0
- package/dist/services/definition.d.ts.map +1 -0
- package/dist/services/definition.js +43 -0
- package/dist/services/definition.js.map +1 -0
- package/dist/services/entity-navigation.d.ts +200 -0
- package/dist/services/entity-navigation.d.ts.map +1 -0
- package/dist/services/entity-navigation.js +211 -0
- package/dist/services/entity-navigation.js.map +1 -0
- package/dist/services/hover.d.ts +81 -0
- package/dist/services/hover.d.ts.map +1 -0
- package/dist/services/hover.js +669 -0
- package/dist/services/hover.js.map +1 -0
- package/dist/services/query.d.ts +116 -0
- package/dist/services/query.d.ts.map +1 -0
- package/dist/services/query.js +225 -0
- package/dist/services/query.js.map +1 -0
- package/dist/services/references.d.ts +52 -0
- package/dist/services/references.d.ts.map +1 -0
- package/dist/services/references.js +66 -0
- package/dist/services/references.js.map +1 -0
- package/dist/services/semantic-tokens.d.ts +54 -0
- package/dist/services/semantic-tokens.d.ts.map +1 -0
- package/dist/services/semantic-tokens.js +213 -0
- package/dist/services/semantic-tokens.js.map +1 -0
- package/dist/services/synthesis.d.ts +90 -0
- package/dist/services/synthesis.d.ts.map +1 -0
- package/dist/services/synthesis.js +113 -0
- package/dist/services/synthesis.js.map +1 -0
- package/dist/source-map.d.ts +42 -0
- package/dist/source-map.d.ts.map +1 -0
- package/dist/source-map.js +170 -0
- package/dist/source-map.js.map +1 -0
- package/package.json +128 -0
- package/tree-sitter-thalo.wasm +0 -0
- package/web-tree-sitter.wasm +0 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
import { toFileLocation } from "../source-map.js";
|
|
2
|
+
import { formatTimestamp } from "../formatters.js";
|
|
3
|
+
import { TypeExpr } from "../schema/registry.js";
|
|
4
|
+
|
|
5
|
+
//#region src/services/hover.ts
|
|
6
|
+
/**
|
|
7
|
+
* Get tags from an entry
|
|
8
|
+
*/
|
|
9
|
+
function getEntryTags(entry) {
|
|
10
|
+
switch (entry.type) {
|
|
11
|
+
case "instance_entry": return entry.header.tags.map((t) => t.name);
|
|
12
|
+
case "schema_entry": return entry.header.tags.map((t) => t.name);
|
|
13
|
+
case "synthesis_entry": return entry.header.tags.map((t) => t.name);
|
|
14
|
+
case "actualize_entry": return [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Format an entry for hover display
|
|
19
|
+
*/
|
|
20
|
+
function formatEntryHover(entry, file) {
|
|
21
|
+
switch (entry.type) {
|
|
22
|
+
case "instance_entry": return formatInstanceEntry(entry, file);
|
|
23
|
+
case "synthesis_entry": return formatSynthesisEntry(entry, file);
|
|
24
|
+
case "actualize_entry": return formatActualizeEntry(entry, file);
|
|
25
|
+
case "schema_entry": return formatSchemaEntry(entry, file);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Format an instance entry for hover
|
|
30
|
+
*/
|
|
31
|
+
function formatInstanceEntry(entry, file) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
const title = entry.header.title?.value ?? "(no title)";
|
|
34
|
+
const timestamp = formatTimestamp(entry.header.timestamp);
|
|
35
|
+
lines.push(`### ${title}`);
|
|
36
|
+
lines.push("");
|
|
37
|
+
lines.push(`**${entry.header.directive}** ${entry.header.entity} • ${timestamp}`);
|
|
38
|
+
const tags = getEntryTags(entry);
|
|
39
|
+
if (tags.length > 0) {
|
|
40
|
+
lines.push("");
|
|
41
|
+
lines.push(`Tags: ${tags.map((t) => `\`#${t}\``).join(" ")}`);
|
|
42
|
+
}
|
|
43
|
+
if (entry.header.link) {
|
|
44
|
+
lines.push("");
|
|
45
|
+
lines.push(`Link: \`^${entry.header.link.id}\``);
|
|
46
|
+
}
|
|
47
|
+
const metadataToShow = [
|
|
48
|
+
"subject",
|
|
49
|
+
"type",
|
|
50
|
+
"confidence",
|
|
51
|
+
"status",
|
|
52
|
+
"ref-type"
|
|
53
|
+
];
|
|
54
|
+
const shownMetadata = [];
|
|
55
|
+
for (const key of metadataToShow) {
|
|
56
|
+
const meta = entry.metadata.find((m) => m.key.value === key);
|
|
57
|
+
if (meta) shownMetadata.push(`**${key}:** ${meta.value.raw}`);
|
|
58
|
+
}
|
|
59
|
+
if (shownMetadata.length > 0) {
|
|
60
|
+
lines.push("");
|
|
61
|
+
lines.push(shownMetadata.join(" • "));
|
|
62
|
+
}
|
|
63
|
+
lines.push("");
|
|
64
|
+
lines.push(`*${file}*`);
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format a schema entry for hover
|
|
69
|
+
*/
|
|
70
|
+
function formatSchemaEntry(entry, file) {
|
|
71
|
+
const lines = [];
|
|
72
|
+
const title = entry.header.title?.value ?? "(no title)";
|
|
73
|
+
const timestamp = formatTimestamp(entry.header.timestamp);
|
|
74
|
+
const entityName = entry.header.entityName.value;
|
|
75
|
+
lines.push(`### ${title}`);
|
|
76
|
+
lines.push("");
|
|
77
|
+
lines.push(`**${entry.header.directive}** \`${entityName}\` • ${timestamp}`);
|
|
78
|
+
const tags = getEntryTags(entry);
|
|
79
|
+
if (tags.length > 0) {
|
|
80
|
+
lines.push("");
|
|
81
|
+
lines.push(`Tags: ${tags.map((t) => `\`#${t}\``).join(" ")}`);
|
|
82
|
+
}
|
|
83
|
+
const fields = entry.metadataBlock?.fields ?? [];
|
|
84
|
+
if (fields.length > 0) {
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push(`**Fields:** ${fields.map((f) => `\`${f.name.value}\``).join(", ")}`);
|
|
87
|
+
}
|
|
88
|
+
const sections = entry.sectionsBlock?.sections ?? [];
|
|
89
|
+
if (sections.length > 0) {
|
|
90
|
+
lines.push("");
|
|
91
|
+
lines.push(`**Sections:** ${sections.map((s) => `\`${s.name.value}\``).join(", ")}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push("");
|
|
94
|
+
lines.push(`*${file}*`);
|
|
95
|
+
return lines.join("\n");
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Format a synthesis entry for hover
|
|
99
|
+
*/
|
|
100
|
+
function formatSynthesisEntry(entry, file) {
|
|
101
|
+
const lines = [];
|
|
102
|
+
const title = entry.header.title?.value ?? "(no title)";
|
|
103
|
+
const timestamp = formatTimestamp(entry.header.timestamp);
|
|
104
|
+
lines.push(`### ${title}`);
|
|
105
|
+
lines.push("");
|
|
106
|
+
lines.push(`**define-synthesis** synthesis • ${timestamp}`);
|
|
107
|
+
const tags = getEntryTags(entry);
|
|
108
|
+
if (tags.length > 0) {
|
|
109
|
+
lines.push("");
|
|
110
|
+
lines.push(`Tags: ${tags.map((t) => `\`#${t}\``).join(" ")}`);
|
|
111
|
+
}
|
|
112
|
+
const sourcesMeta = entry.metadata.find((m) => m.key.value === "sources");
|
|
113
|
+
if (sourcesMeta && sourcesMeta.value.content.type === "query_value") {
|
|
114
|
+
lines.push("");
|
|
115
|
+
lines.push(`**Sources:** ${sourcesMeta.value.content.query.entity}`);
|
|
116
|
+
}
|
|
117
|
+
lines.push("");
|
|
118
|
+
lines.push(`*${file}*`);
|
|
119
|
+
return lines.join("\n");
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Format an actualize entry for hover
|
|
123
|
+
*/
|
|
124
|
+
function formatActualizeEntry(entry, file) {
|
|
125
|
+
const lines = [];
|
|
126
|
+
const timestamp = formatTimestamp(entry.header.timestamp);
|
|
127
|
+
lines.push(`### actualize-synthesis`);
|
|
128
|
+
lines.push("");
|
|
129
|
+
lines.push(`**actualize-synthesis** ^${entry.header.target.id} • ${timestamp}`);
|
|
130
|
+
const updated = entry.metadata.find((m) => m.key.value === "updated");
|
|
131
|
+
if (updated) {
|
|
132
|
+
lines.push("");
|
|
133
|
+
lines.push(`**Updated:** ${updated.value.raw}`);
|
|
134
|
+
}
|
|
135
|
+
lines.push("");
|
|
136
|
+
lines.push(`*${file}*`);
|
|
137
|
+
return lines.join("\n");
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get documentation for a directive
|
|
141
|
+
*/
|
|
142
|
+
function getDirectiveDocumentation(directive) {
|
|
143
|
+
switch (directive) {
|
|
144
|
+
case "create": return [
|
|
145
|
+
"### `create` directive",
|
|
146
|
+
"",
|
|
147
|
+
"Creates a new instance entry.",
|
|
148
|
+
"",
|
|
149
|
+
"**Syntax:**",
|
|
150
|
+
"```",
|
|
151
|
+
"{timestamp} create {entity} \"Title\" [^link-id] [#tags...]",
|
|
152
|
+
" {key}: {value}",
|
|
153
|
+
" ...",
|
|
154
|
+
"```",
|
|
155
|
+
"",
|
|
156
|
+
"Add an explicit `^link-id` for cross-referencing.",
|
|
157
|
+
"",
|
|
158
|
+
"**Entities:** `journal`, `lore`, `opinion`, `reference`"
|
|
159
|
+
].join("\n");
|
|
160
|
+
case "update": return [
|
|
161
|
+
"### `update` directive",
|
|
162
|
+
"",
|
|
163
|
+
"Updates an existing entry, typically to revise opinions or add information.",
|
|
164
|
+
"",
|
|
165
|
+
"**Syntax:**",
|
|
166
|
+
"```",
|
|
167
|
+
"{timestamp} update {entity} \"Title\" [^link-id] [#tags...]",
|
|
168
|
+
" supersedes: ^previous-entry",
|
|
169
|
+
" ...",
|
|
170
|
+
"```",
|
|
171
|
+
"",
|
|
172
|
+
"Use `supersedes:` metadata to link to the entry being updated.",
|
|
173
|
+
"",
|
|
174
|
+
"**Entities:** `journal`, `lore`, `opinion`, `reference`"
|
|
175
|
+
].join("\n");
|
|
176
|
+
case "define-entity": return [
|
|
177
|
+
"### `define-entity` directive",
|
|
178
|
+
"",
|
|
179
|
+
"Defines a new entity schema with fields and sections.",
|
|
180
|
+
"",
|
|
181
|
+
"**Syntax:**",
|
|
182
|
+
"```",
|
|
183
|
+
"{timestamp} define-entity {name} \"Description\"",
|
|
184
|
+
" # Metadata",
|
|
185
|
+
" field-name: type ; \"description\"",
|
|
186
|
+
" optional-field?: type = default ; \"description\"",
|
|
187
|
+
" # Sections",
|
|
188
|
+
" SectionName ; \"description\"",
|
|
189
|
+
" OptionalSection? ; \"description\"",
|
|
190
|
+
"```",
|
|
191
|
+
"",
|
|
192
|
+
"**Field types:** `string`, `datetime`, `daterange`, `number`, `link`, `\"literal\"`, unions (`|`), arrays (`[]`)"
|
|
193
|
+
].join("\n");
|
|
194
|
+
case "alter-entity": return [
|
|
195
|
+
"### `alter-entity` directive",
|
|
196
|
+
"",
|
|
197
|
+
"Modifies an existing entity schema.",
|
|
198
|
+
"",
|
|
199
|
+
"**Syntax:**",
|
|
200
|
+
"```",
|
|
201
|
+
"{timestamp} alter-entity {name} \"Description of change\"",
|
|
202
|
+
" # Metadata",
|
|
203
|
+
" new-field: type ; \"add a field\"",
|
|
204
|
+
" # Remove Metadata",
|
|
205
|
+
" old-field ; \"reason for removal\"",
|
|
206
|
+
" # Sections",
|
|
207
|
+
" NewSection ; \"add a section\"",
|
|
208
|
+
" # Remove Sections",
|
|
209
|
+
" OldSection ; \"reason for removal\"",
|
|
210
|
+
"```",
|
|
211
|
+
"",
|
|
212
|
+
"All blocks are optional. Only include what you're changing."
|
|
213
|
+
].join("\n");
|
|
214
|
+
case "define-synthesis": return [
|
|
215
|
+
"### `define-synthesis` directive",
|
|
216
|
+
"",
|
|
217
|
+
"Defines a synthesis operation that queries entries and generates content via LLM.",
|
|
218
|
+
"",
|
|
219
|
+
"**Syntax:**",
|
|
220
|
+
"```",
|
|
221
|
+
"{timestamp} define-synthesis \"Title\" ^link-id [#tags...]",
|
|
222
|
+
" sources: {entity} where {conditions}",
|
|
223
|
+
"",
|
|
224
|
+
" # Prompt",
|
|
225
|
+
" Instructions for the LLM...",
|
|
226
|
+
"```",
|
|
227
|
+
"",
|
|
228
|
+
"**Query language:**",
|
|
229
|
+
"- `{entity} where {conditions}` — Query entries",
|
|
230
|
+
"- Conditions: `field = value`, `#tag`, `^link`",
|
|
231
|
+
"- Multiple queries: comma-separated",
|
|
232
|
+
"",
|
|
233
|
+
"**Example:**",
|
|
234
|
+
"```",
|
|
235
|
+
"2026-01-05T10:00 define-synthesis \"Career Summary\" ^career-summary",
|
|
236
|
+
" sources: lore where subject = ^self and #career",
|
|
237
|
+
"",
|
|
238
|
+
" # Prompt",
|
|
239
|
+
" Write a professional career summary from these lore entries.",
|
|
240
|
+
"```"
|
|
241
|
+
].join("\n");
|
|
242
|
+
case "actualize-synthesis": return [
|
|
243
|
+
"### `actualize-synthesis` directive",
|
|
244
|
+
"",
|
|
245
|
+
"Triggers a synthesis to regenerate its output based on current data.",
|
|
246
|
+
"",
|
|
247
|
+
"**Syntax:**",
|
|
248
|
+
"```",
|
|
249
|
+
"{timestamp} actualize-synthesis ^target-synthesis",
|
|
250
|
+
" updated: {timestamp}",
|
|
251
|
+
"```",
|
|
252
|
+
"",
|
|
253
|
+
"**Required metadata:**",
|
|
254
|
+
"- `updated:` — Timestamp when the synthesis was actualized",
|
|
255
|
+
"",
|
|
256
|
+
"**Example:**",
|
|
257
|
+
"```",
|
|
258
|
+
"2026-01-05T15:30 actualize-synthesis ^career-summary",
|
|
259
|
+
" updated: 2026-01-05T15:30",
|
|
260
|
+
"```"
|
|
261
|
+
].join("\n");
|
|
262
|
+
default: return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Format an entity schema for hover display
|
|
267
|
+
*/
|
|
268
|
+
function formatEntitySchema(schema) {
|
|
269
|
+
const lines = [];
|
|
270
|
+
lines.push(`### Entity: \`${schema.name}\``);
|
|
271
|
+
lines.push("");
|
|
272
|
+
lines.push(schema.description);
|
|
273
|
+
lines.push("");
|
|
274
|
+
if (schema.fields.size > 0) {
|
|
275
|
+
lines.push("**Metadata Fields:**");
|
|
276
|
+
lines.push("");
|
|
277
|
+
for (const [, field] of schema.fields) {
|
|
278
|
+
const typeStr = TypeExpr.toString(field.type);
|
|
279
|
+
const opt = field.optional ? "?" : "";
|
|
280
|
+
const desc = field.description ? ` — ${field.description}` : "";
|
|
281
|
+
const def = field.defaultValue ? ` (default: \`${field.defaultValue}\`)` : "";
|
|
282
|
+
lines.push(`- \`${field.name}${opt}\`: \`${typeStr}\`${def}${desc}`);
|
|
283
|
+
}
|
|
284
|
+
lines.push("");
|
|
285
|
+
}
|
|
286
|
+
if (schema.sections.size > 0) {
|
|
287
|
+
lines.push("**Sections:**");
|
|
288
|
+
lines.push("");
|
|
289
|
+
for (const [, section] of schema.sections) {
|
|
290
|
+
const opt = section.optional ? " (optional)" : "";
|
|
291
|
+
const desc = section.description ? ` — ${section.description}` : "";
|
|
292
|
+
lines.push(`- \`# ${section.name}\`${opt}${desc}`);
|
|
293
|
+
}
|
|
294
|
+
lines.push("");
|
|
295
|
+
}
|
|
296
|
+
lines.push(`*Defined at ${schema.definedAt} in ${schema.definedIn}*`);
|
|
297
|
+
return lines.join("\n");
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Format a field schema for hover display
|
|
301
|
+
*/
|
|
302
|
+
function formatFieldHover(field, entityName) {
|
|
303
|
+
const lines = [];
|
|
304
|
+
const typeStr = TypeExpr.toString(field.type);
|
|
305
|
+
const opt = field.optional ? " (optional)" : " (required)";
|
|
306
|
+
lines.push(`### Field: \`${field.name}\``);
|
|
307
|
+
lines.push("");
|
|
308
|
+
lines.push(`**Type:** \`${typeStr}\`${opt}`);
|
|
309
|
+
if (field.defaultValue) {
|
|
310
|
+
lines.push("");
|
|
311
|
+
lines.push(`**Default:** \`${field.defaultValue}\``);
|
|
312
|
+
}
|
|
313
|
+
if (field.description) {
|
|
314
|
+
lines.push("");
|
|
315
|
+
lines.push(field.description);
|
|
316
|
+
}
|
|
317
|
+
lines.push("");
|
|
318
|
+
lines.push(`*From entity \`${entityName}\`*`);
|
|
319
|
+
return lines.join("\n");
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Format a section schema for hover display
|
|
323
|
+
*/
|
|
324
|
+
function formatSectionHover(section, entityName) {
|
|
325
|
+
const lines = [];
|
|
326
|
+
const opt = section.optional ? " (optional)" : " (required)";
|
|
327
|
+
lines.push(`### Section: \`# ${section.name}\``);
|
|
328
|
+
lines.push("");
|
|
329
|
+
lines.push(`**Status:** ${opt.trim()}`);
|
|
330
|
+
if (section.description) {
|
|
331
|
+
lines.push("");
|
|
332
|
+
lines.push(section.description);
|
|
333
|
+
}
|
|
334
|
+
lines.push("");
|
|
335
|
+
lines.push(`*From entity \`${entityName}\`*`);
|
|
336
|
+
return lines.join("\n");
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get documentation for a primitive type
|
|
340
|
+
*/
|
|
341
|
+
function getPrimitiveTypeDocumentation(typeName) {
|
|
342
|
+
switch (typeName) {
|
|
343
|
+
case "string": return [
|
|
344
|
+
"### Type: `string`",
|
|
345
|
+
"",
|
|
346
|
+
"Any text value. Can be quoted or unquoted in metadata.",
|
|
347
|
+
"",
|
|
348
|
+
"**Examples:**",
|
|
349
|
+
"```",
|
|
350
|
+
"author: \"Jane Doe\"",
|
|
351
|
+
"author: Jane Doe",
|
|
352
|
+
"```"
|
|
353
|
+
].join("\n");
|
|
354
|
+
case "datetime": return [
|
|
355
|
+
"### Type: `datetime`",
|
|
356
|
+
"",
|
|
357
|
+
"A date in ISO format (YYYY-MM-DD).",
|
|
358
|
+
"",
|
|
359
|
+
"**Format:** `YYYY-MM-DD`",
|
|
360
|
+
"",
|
|
361
|
+
"**Example:**",
|
|
362
|
+
"```",
|
|
363
|
+
"published: 2024-05-11",
|
|
364
|
+
"```",
|
|
365
|
+
"",
|
|
366
|
+
"Note: For partial dates (YYYY or YYYY-MM), use `daterange` type."
|
|
367
|
+
].join("\n");
|
|
368
|
+
case "daterange": return [
|
|
369
|
+
"### Type: `daterange`",
|
|
370
|
+
"",
|
|
371
|
+
"A range between two dates, using `~` separator.",
|
|
372
|
+
"",
|
|
373
|
+
"**Format:** `{date} ~ {date}`",
|
|
374
|
+
"",
|
|
375
|
+
"**Examples:**",
|
|
376
|
+
"```",
|
|
377
|
+
"date: 2020 ~ 2021",
|
|
378
|
+
"date: 2022-05 ~ 2024",
|
|
379
|
+
"date: 2024-01-01 ~ 2024-12-31",
|
|
380
|
+
"```"
|
|
381
|
+
].join("\n");
|
|
382
|
+
case "link": return [
|
|
383
|
+
"### Type: `link`",
|
|
384
|
+
"",
|
|
385
|
+
"A reference to another entry using its link ID.",
|
|
386
|
+
"",
|
|
387
|
+
"**Format:** `^{link-id}`",
|
|
388
|
+
"",
|
|
389
|
+
"Link IDs can be:",
|
|
390
|
+
"- Timestamps (implicit): `^2026-01-05T15:30`",
|
|
391
|
+
"- Explicit IDs: `^opinion-ts-enums`",
|
|
392
|
+
"- Special: `^self` (reference to self/author)",
|
|
393
|
+
"",
|
|
394
|
+
"**Example:**",
|
|
395
|
+
"```",
|
|
396
|
+
"supersedes: ^2026-01-05T15:30",
|
|
397
|
+
"subject: ^self",
|
|
398
|
+
"```"
|
|
399
|
+
].join("\n");
|
|
400
|
+
case "number": return [
|
|
401
|
+
"### Type: `number`",
|
|
402
|
+
"",
|
|
403
|
+
"A numeric value (integer or decimal).",
|
|
404
|
+
"",
|
|
405
|
+
"**Examples:**",
|
|
406
|
+
"```",
|
|
407
|
+
"rating: 5",
|
|
408
|
+
"score: 4.5",
|
|
409
|
+
"count: -10",
|
|
410
|
+
"```"
|
|
411
|
+
].join("\n");
|
|
412
|
+
default: return null;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Format tag hover information
|
|
417
|
+
*/
|
|
418
|
+
function formatTagHover(tag, entries) {
|
|
419
|
+
const lines = [];
|
|
420
|
+
lines.push(`### Tag: \`#${tag}\``);
|
|
421
|
+
lines.push("");
|
|
422
|
+
lines.push(`Used in **${entries.length}** ${entries.length === 1 ? "entry" : "entries"}:`);
|
|
423
|
+
lines.push("");
|
|
424
|
+
const toShow = entries.slice(0, 5);
|
|
425
|
+
for (const { entry } of toShow) {
|
|
426
|
+
let title;
|
|
427
|
+
let timestamp;
|
|
428
|
+
switch (entry.type) {
|
|
429
|
+
case "instance_entry":
|
|
430
|
+
title = entry.header.title?.value ?? "(no title)";
|
|
431
|
+
timestamp = formatTimestamp(entry.header.timestamp);
|
|
432
|
+
break;
|
|
433
|
+
case "synthesis_entry":
|
|
434
|
+
title = entry.header.title?.value ?? "(no title)";
|
|
435
|
+
timestamp = formatTimestamp(entry.header.timestamp);
|
|
436
|
+
break;
|
|
437
|
+
case "actualize_entry":
|
|
438
|
+
title = `actualize-synthesis ^${entry.header.target.id}`;
|
|
439
|
+
timestamp = formatTimestamp(entry.header.timestamp);
|
|
440
|
+
break;
|
|
441
|
+
case "schema_entry":
|
|
442
|
+
title = entry.header.title?.value ?? "(no title)";
|
|
443
|
+
timestamp = formatTimestamp(entry.header.timestamp);
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
lines.push(`- ${title} *(${timestamp})*`);
|
|
447
|
+
}
|
|
448
|
+
if (entries.length > 5) lines.push(`- *...and ${entries.length - 5} more*`);
|
|
449
|
+
return lines.join("\n");
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Format timestamp hover
|
|
453
|
+
*/
|
|
454
|
+
function formatTimestampHover(timestamp, entry, _file) {
|
|
455
|
+
const lines = [];
|
|
456
|
+
lines.push(`### Timestamp: \`${timestamp}\``);
|
|
457
|
+
lines.push("");
|
|
458
|
+
if (entry) {
|
|
459
|
+
lines.push("This timestamp identifies an entry:");
|
|
460
|
+
lines.push("");
|
|
461
|
+
let title;
|
|
462
|
+
let directiveInfo;
|
|
463
|
+
switch (entry.type) {
|
|
464
|
+
case "instance_entry":
|
|
465
|
+
title = entry.header.title?.value ?? "(no title)";
|
|
466
|
+
directiveInfo = `\`${entry.header.directive}\` ${entry.header.entity}`;
|
|
467
|
+
break;
|
|
468
|
+
case "synthesis_entry":
|
|
469
|
+
title = entry.header.title?.value ?? "(no title)";
|
|
470
|
+
directiveInfo = "`define-synthesis` synthesis";
|
|
471
|
+
break;
|
|
472
|
+
case "actualize_entry":
|
|
473
|
+
title = `actualize-synthesis ^${entry.header.target.id}`;
|
|
474
|
+
directiveInfo = `\`actualize-synthesis\` ^${entry.header.target.id}`;
|
|
475
|
+
break;
|
|
476
|
+
case "schema_entry":
|
|
477
|
+
title = entry.header.title?.value ?? "(no title)";
|
|
478
|
+
directiveInfo = `\`${entry.header.directive}\` ${entry.header.entityName.value}`;
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
lines.push(`**${title}**`);
|
|
482
|
+
lines.push("");
|
|
483
|
+
lines.push(directiveInfo);
|
|
484
|
+
lines.push("");
|
|
485
|
+
lines.push(`Reference with: \`^${timestamp}\``);
|
|
486
|
+
} else {
|
|
487
|
+
lines.push("Entry timestamp.");
|
|
488
|
+
lines.push("");
|
|
489
|
+
lines.push("Add an explicit `^link-id` after the title to enable cross-referencing.");
|
|
490
|
+
}
|
|
491
|
+
return lines.join("\n");
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Get hover information for a node context.
|
|
495
|
+
*
|
|
496
|
+
* This function takes a semantic node context (from findNodeAtPosition) and
|
|
497
|
+
* returns hover information including markdown content and an optional range.
|
|
498
|
+
*
|
|
499
|
+
* @param workspace - The workspace to look up entries, schemas, etc.
|
|
500
|
+
* @param context - The node context from findNodeAtPosition
|
|
501
|
+
* @returns Hover result with markdown content, or null if no hover info
|
|
502
|
+
*/
|
|
503
|
+
function getHoverInfo(workspace, context) {
|
|
504
|
+
switch (context.kind) {
|
|
505
|
+
case "link": {
|
|
506
|
+
const definition = workspace.getLinkDefinition(context.linkId);
|
|
507
|
+
if (definition) return {
|
|
508
|
+
content: formatEntryHover(definition.entry, definition.file),
|
|
509
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
510
|
+
};
|
|
511
|
+
return {
|
|
512
|
+
content: `⚠️ **Unknown link:** \`^${context.linkId}\`\n\nNo entry found with this ID.`,
|
|
513
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
case "tag": {
|
|
517
|
+
const entries = [];
|
|
518
|
+
for (const model of workspace.allModels()) for (const entry of model.ast.entries) if (getEntryTags(entry).includes(context.tagName)) entries.push({
|
|
519
|
+
entry,
|
|
520
|
+
file: model.file
|
|
521
|
+
});
|
|
522
|
+
if (entries.length > 0) return {
|
|
523
|
+
content: formatTagHover(context.tagName, entries),
|
|
524
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
525
|
+
};
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
528
|
+
case "directive": {
|
|
529
|
+
const doc = getDirectiveDocumentation(context.directive);
|
|
530
|
+
if (doc) return {
|
|
531
|
+
content: doc,
|
|
532
|
+
range: toFileLocation(context.sourceMap, context.location)
|
|
533
|
+
};
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
case "entity": {
|
|
537
|
+
const schema = workspace.schemaRegistry.get(context.entityName);
|
|
538
|
+
if (schema) return {
|
|
539
|
+
content: formatEntitySchema(schema),
|
|
540
|
+
range: toFileLocation(context.sourceMap, context.location)
|
|
541
|
+
};
|
|
542
|
+
return {
|
|
543
|
+
content: `⚠️ **Unknown entity:** \`${context.entityName}\`\n\nNo schema found. Define with \`define-entity\`.`,
|
|
544
|
+
range: toFileLocation(context.sourceMap, context.location)
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
case "schema_entity": {
|
|
548
|
+
const schema = workspace.schemaRegistry.get(context.entityName);
|
|
549
|
+
if (schema) return {
|
|
550
|
+
content: formatEntitySchema(schema),
|
|
551
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
552
|
+
};
|
|
553
|
+
return {
|
|
554
|
+
content: `**Entity:** \`${context.entityName}\`\n\n*Being defined in this entry*`,
|
|
555
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
case "metadata_key":
|
|
559
|
+
if (context.entityContext) {
|
|
560
|
+
const schema = workspace.schemaRegistry.get(context.entityContext);
|
|
561
|
+
if (schema) {
|
|
562
|
+
const field = schema.fields.get(context.key);
|
|
563
|
+
if (field) return {
|
|
564
|
+
content: formatFieldHover(field, context.entityContext),
|
|
565
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
return {
|
|
570
|
+
content: `**Field:** \`${context.key}\`\n\n*Not defined in entity schema*`,
|
|
571
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
572
|
+
};
|
|
573
|
+
case "timestamp": {
|
|
574
|
+
let foundEntry;
|
|
575
|
+
let foundFile;
|
|
576
|
+
for (const model of workspace.allModels()) {
|
|
577
|
+
for (const entry of model.ast.entries) {
|
|
578
|
+
let ts;
|
|
579
|
+
switch (entry.type) {
|
|
580
|
+
case "instance_entry":
|
|
581
|
+
ts = entry.header.timestamp;
|
|
582
|
+
break;
|
|
583
|
+
case "schema_entry":
|
|
584
|
+
ts = entry.header.timestamp;
|
|
585
|
+
break;
|
|
586
|
+
case "synthesis_entry":
|
|
587
|
+
ts = entry.header.timestamp;
|
|
588
|
+
break;
|
|
589
|
+
case "actualize_entry":
|
|
590
|
+
ts = entry.header.timestamp;
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
if (formatTimestamp(ts) === context.value || ts.value === context.value) {
|
|
594
|
+
foundEntry = entry;
|
|
595
|
+
foundFile = model.file;
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
if (foundEntry) break;
|
|
600
|
+
}
|
|
601
|
+
return {
|
|
602
|
+
content: formatTimestampHover(context.value, foundEntry, foundFile),
|
|
603
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
case "type": {
|
|
607
|
+
const doc = getPrimitiveTypeDocumentation(context.typeName);
|
|
608
|
+
if (doc) return {
|
|
609
|
+
content: doc,
|
|
610
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
611
|
+
};
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
case "section_header":
|
|
615
|
+
if (context.entityContext) {
|
|
616
|
+
const schema = workspace.schemaRegistry.get(context.entityContext);
|
|
617
|
+
if (schema) {
|
|
618
|
+
const section = schema.sections.get(context.sectionName);
|
|
619
|
+
if (section) return {
|
|
620
|
+
content: formatSectionHover(section, context.entityContext),
|
|
621
|
+
range: toFileLocation(context.sourceMap, context.location)
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return {
|
|
626
|
+
content: `**Section:** \`# ${context.sectionName}\`\n\n*Not defined in entity schema*`,
|
|
627
|
+
range: toFileLocation(context.sourceMap, context.location)
|
|
628
|
+
};
|
|
629
|
+
case "field_name":
|
|
630
|
+
if (context.entityContext) {
|
|
631
|
+
const schema = workspace.schemaRegistry.get(context.entityContext);
|
|
632
|
+
if (schema) {
|
|
633
|
+
const field = schema.fields.get(context.fieldName);
|
|
634
|
+
if (field) return {
|
|
635
|
+
content: formatFieldHover(field, context.entityContext),
|
|
636
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
return {
|
|
641
|
+
content: `**Field:** \`${context.fieldName}\`\n\n*Being defined in this schema*`,
|
|
642
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
643
|
+
};
|
|
644
|
+
case "section_name":
|
|
645
|
+
if (context.entityContext) {
|
|
646
|
+
const schema = workspace.schemaRegistry.get(context.entityContext);
|
|
647
|
+
if (schema) {
|
|
648
|
+
const section = schema.sections.get(context.sectionName);
|
|
649
|
+
if (section) return {
|
|
650
|
+
content: formatSectionHover(section, context.entityContext),
|
|
651
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
return {
|
|
656
|
+
content: `**Section:** \`# ${context.sectionName}\`\n\n*Being defined in this schema*`,
|
|
657
|
+
range: toFileLocation(context.sourceMap, context.node.location)
|
|
658
|
+
};
|
|
659
|
+
case "title": return {
|
|
660
|
+
content: `**Title:** "${context.title}"`,
|
|
661
|
+
range: toFileLocation(context.sourceMap, context.location)
|
|
662
|
+
};
|
|
663
|
+
default: return null;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
//#endregion
|
|
668
|
+
export { formatActualizeEntry, formatEntitySchema, formatEntryHover, formatFieldHover, formatInstanceEntry, formatSchemaEntry, formatSectionHover, formatSynthesisEntry, formatTagHover, formatTimestampHover, getDirectiveDocumentation, getHoverInfo, getPrimitiveTypeDocumentation };
|
|
669
|
+
//# sourceMappingURL=hover.js.map
|