flowscript-core 1.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 +386 -0
- package/bin/flowscript +12 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +463 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors/indentation-error.d.ts +11 -0
- package/dist/errors/indentation-error.d.ts.map +1 -0
- package/dist/errors/indentation-error.js +22 -0
- package/dist/errors/indentation-error.js.map +1 -0
- package/dist/grammar.ohm +132 -0
- package/dist/hash.d.ts +21 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +82 -0
- package/dist/hash.js.map +1 -0
- package/dist/indentation-scanner.d.ts +81 -0
- package/dist/indentation-scanner.d.ts.map +1 -0
- package/dist/indentation-scanner.js +290 -0
- package/dist/indentation-scanner.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/linter.d.ts +71 -0
- package/dist/linter.d.ts.map +1 -0
- package/dist/linter.js +122 -0
- package/dist/linter.js.map +1 -0
- package/dist/memory.d.ts +506 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +1802 -0
- package/dist/memory.js.map +1 -0
- package/dist/parser.d.ts +53 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +1184 -0
- package/dist/parser.js.map +1 -0
- package/dist/query-engine.d.ts +320 -0
- package/dist/query-engine.d.ts.map +1 -0
- package/dist/query-engine.js +884 -0
- package/dist/query-engine.js.map +1 -0
- package/dist/rules/alternatives-without-decision.d.ts +24 -0
- package/dist/rules/alternatives-without-decision.d.ts.map +1 -0
- package/dist/rules/alternatives-without-decision.js +58 -0
- package/dist/rules/alternatives-without-decision.js.map +1 -0
- package/dist/rules/causal-cycles.d.ts +23 -0
- package/dist/rules/causal-cycles.d.ts.map +1 -0
- package/dist/rules/causal-cycles.js +83 -0
- package/dist/rules/causal-cycles.js.map +1 -0
- package/dist/rules/deep-nesting.d.ts +23 -0
- package/dist/rules/deep-nesting.d.ts.map +1 -0
- package/dist/rules/deep-nesting.js +55 -0
- package/dist/rules/deep-nesting.js.map +1 -0
- package/dist/rules/index.d.ts +15 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +29 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/invalid-syntax.d.ts +22 -0
- package/dist/rules/invalid-syntax.d.ts.map +1 -0
- package/dist/rules/invalid-syntax.js +52 -0
- package/dist/rules/invalid-syntax.js.map +1 -0
- package/dist/rules/long-causal-chains.d.ts +25 -0
- package/dist/rules/long-causal-chains.d.ts.map +1 -0
- package/dist/rules/long-causal-chains.js +75 -0
- package/dist/rules/long-causal-chains.js.map +1 -0
- package/dist/rules/missing-recommended-fields.d.ts +21 -0
- package/dist/rules/missing-recommended-fields.d.ts.map +1 -0
- package/dist/rules/missing-recommended-fields.js +45 -0
- package/dist/rules/missing-recommended-fields.js.map +1 -0
- package/dist/rules/missing-required-fields.d.ts +22 -0
- package/dist/rules/missing-required-fields.d.ts.map +1 -0
- package/dist/rules/missing-required-fields.js +46 -0
- package/dist/rules/missing-required-fields.js.map +1 -0
- package/dist/rules/orphaned-nodes.d.ts +22 -0
- package/dist/rules/orphaned-nodes.d.ts.map +1 -0
- package/dist/rules/orphaned-nodes.js +76 -0
- package/dist/rules/orphaned-nodes.js.map +1 -0
- package/dist/rules/unlabeled-tension.d.ts +20 -0
- package/dist/rules/unlabeled-tension.d.ts.map +1 -0
- package/dist/rules/unlabeled-tension.js +37 -0
- package/dist/rules/unlabeled-tension.js.map +1 -0
- package/dist/serializer.d.ts +40 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/serializer.js +368 -0
- package/dist/serializer.js.map +1 -0
- package/dist/tokenizer.d.ts +26 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +213 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +18 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +68 -0
- package/dist/validate.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FlowScript IR → .fs Serializer
|
|
4
|
+
*
|
|
5
|
+
* Converts an IR (Intermediate Representation) back to valid FlowScript text.
|
|
6
|
+
* The produced text, when re-parsed, should produce a semantically equivalent IR.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Walks the node graph in provenance order (line numbers)
|
|
10
|
+
* - Reconstructs nesting from children arrays
|
|
11
|
+
* - Renders relationships as continuation lines (-> target) under source nodes
|
|
12
|
+
* - Places state markers before their annotated nodes (separate line if provenance differs)
|
|
13
|
+
* - Preserves modifiers, axis labels, and state fields
|
|
14
|
+
* - Typed relationship targets preserve both operator and type (-> thought: content)
|
|
15
|
+
*
|
|
16
|
+
* KNOWN LIMITATION — Cross-Reference Drops (Graph vs Tree):
|
|
17
|
+
* .fs text is indentation-based (tree structure). The IR is a graph (nodes can have
|
|
18
|
+
* multiple incoming edges). When a node is the target of relationships from multiple
|
|
19
|
+
* sources, only the parent-child relationship is rendered. Cross-cutting relationships
|
|
20
|
+
* (A -> B where B is already a child of C) are silently dropped during serialization.
|
|
21
|
+
*
|
|
22
|
+
* This is a fundamental format limitation, not a bug. The IR JSON preserves the full
|
|
23
|
+
* graph; .fs is a lossy tree projection. This MUST be addressed when building the
|
|
24
|
+
* Memory class — the Memory API will produce cross-cutting graphs that need either:
|
|
25
|
+
* (a) ID-based reference syntax in .fs (grammar extension)
|
|
26
|
+
* (b) Accepting .fs as lossy with JSON as canonical
|
|
27
|
+
* (c) A cross-references section at the end of .fs output
|
|
28
|
+
* See: https://github.com/phillipclapham/flowscript — design decision pending.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.serialize = serialize;
|
|
32
|
+
/**
|
|
33
|
+
* Serialize an IR back to FlowScript text.
|
|
34
|
+
*/
|
|
35
|
+
function serialize(ir, options = {}) {
|
|
36
|
+
const indent = options.indent ?? ' ';
|
|
37
|
+
const blankLinesBetween = options.blankLinesBetween ?? true;
|
|
38
|
+
// Build lookup maps
|
|
39
|
+
const nodeMap = new Map();
|
|
40
|
+
for (const node of ir.nodes) {
|
|
41
|
+
// Skip block nodes — they're structural containers, not content
|
|
42
|
+
if (node.type === 'block')
|
|
43
|
+
continue;
|
|
44
|
+
nodeMap.set(node.id, node);
|
|
45
|
+
}
|
|
46
|
+
// Relationships by source node
|
|
47
|
+
const relsBySource = new Map();
|
|
48
|
+
for (const rel of ir.relationships) {
|
|
49
|
+
const existing = relsBySource.get(rel.source) ?? [];
|
|
50
|
+
existing.push(rel);
|
|
51
|
+
relsBySource.set(rel.source, existing);
|
|
52
|
+
}
|
|
53
|
+
// States by node
|
|
54
|
+
const statesByNode = new Map();
|
|
55
|
+
for (const state of ir.states) {
|
|
56
|
+
if (!state.node_id)
|
|
57
|
+
continue;
|
|
58
|
+
const existing = statesByNode.get(state.node_id) ?? [];
|
|
59
|
+
existing.push(state);
|
|
60
|
+
statesByNode.set(state.node_id, existing);
|
|
61
|
+
}
|
|
62
|
+
// Track which nodes are children of other nodes
|
|
63
|
+
const isChild = new Set();
|
|
64
|
+
for (const node of ir.nodes) {
|
|
65
|
+
if (node.type === 'block')
|
|
66
|
+
continue;
|
|
67
|
+
if (node.children) {
|
|
68
|
+
for (const childId of node.children) {
|
|
69
|
+
isChild.add(childId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Build set of relationship targets from each source, so we know which
|
|
74
|
+
// children should be rendered with relationship operators
|
|
75
|
+
const childRelFromParent = new Map();
|
|
76
|
+
for (const [sourceId, rels] of relsBySource) {
|
|
77
|
+
const sourceNode = nodeMap.get(sourceId);
|
|
78
|
+
if (!sourceNode?.children)
|
|
79
|
+
continue;
|
|
80
|
+
const childSet = new Set(sourceNode.children);
|
|
81
|
+
for (const rel of rels) {
|
|
82
|
+
if (childSet.has(rel.target)) {
|
|
83
|
+
childRelFromParent.set(rel.target, rel);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Find root nodes: not children of any non-block node, sorted by provenance line
|
|
88
|
+
const roots = [];
|
|
89
|
+
for (const node of ir.nodes) {
|
|
90
|
+
if (node.type === 'block')
|
|
91
|
+
continue;
|
|
92
|
+
if (!isChild.has(node.id)) {
|
|
93
|
+
roots.push(node);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
roots.sort((a, b) => a.provenance.line_number - b.provenance.line_number);
|
|
97
|
+
// Serialize — shared context across all roots so rendered tracking works
|
|
98
|
+
const lines = [];
|
|
99
|
+
const ctx = {
|
|
100
|
+
indent,
|
|
101
|
+
nodeMap,
|
|
102
|
+
relsBySource,
|
|
103
|
+
statesByNode,
|
|
104
|
+
childRelFromParent,
|
|
105
|
+
isChild,
|
|
106
|
+
rendered: new Set(),
|
|
107
|
+
};
|
|
108
|
+
let renderedRootCount = 0;
|
|
109
|
+
for (const root of roots) {
|
|
110
|
+
// Skip roots that were already rendered as relationship targets
|
|
111
|
+
if (ctx.rendered.has(root.id))
|
|
112
|
+
continue;
|
|
113
|
+
// Blank line between top-level elements
|
|
114
|
+
if (blankLinesBetween && renderedRootCount > 0) {
|
|
115
|
+
lines.push('');
|
|
116
|
+
}
|
|
117
|
+
serializeNode(root, 0, lines, ctx);
|
|
118
|
+
renderedRootCount++;
|
|
119
|
+
}
|
|
120
|
+
return lines.join('\n') + '\n';
|
|
121
|
+
}
|
|
122
|
+
function serializeNode(node, depth, lines, ctx) {
|
|
123
|
+
ctx.rendered.add(node.id);
|
|
124
|
+
const prefix = ctx.indent.repeat(depth);
|
|
125
|
+
// State markers: render on separate line if provenance shows they were
|
|
126
|
+
// originally on a different line than their target node, otherwise inline
|
|
127
|
+
const states = ctx.statesByNode.get(node.id) ?? [];
|
|
128
|
+
const separateStates = [];
|
|
129
|
+
const inlineStates = [];
|
|
130
|
+
for (const state of states) {
|
|
131
|
+
if (state.provenance.line_number < node.provenance.line_number) {
|
|
132
|
+
separateStates.push(state);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
inlineStates.push(state);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Render separate state markers on their own lines
|
|
139
|
+
for (const state of separateStates) {
|
|
140
|
+
lines.push(prefix + renderState(state));
|
|
141
|
+
}
|
|
142
|
+
// Build the node line
|
|
143
|
+
const modifiers = renderModifiers(node.modifiers);
|
|
144
|
+
const inlineStateStr = renderStates(inlineStates);
|
|
145
|
+
const typePrefix = renderTypePrefix(node.type);
|
|
146
|
+
const content = node.content;
|
|
147
|
+
// Compose the line
|
|
148
|
+
let line = prefix;
|
|
149
|
+
line += modifiers;
|
|
150
|
+
line += inlineStateStr;
|
|
151
|
+
line += typePrefix;
|
|
152
|
+
line += content;
|
|
153
|
+
lines.push(line);
|
|
154
|
+
// Render children
|
|
155
|
+
if (node.children && node.children.length > 0) {
|
|
156
|
+
for (const childId of node.children) {
|
|
157
|
+
const childNode = ctx.nodeMap.get(childId);
|
|
158
|
+
if (!childNode)
|
|
159
|
+
continue;
|
|
160
|
+
// Check if this child has a relationship from its parent
|
|
161
|
+
const rel = ctx.childRelFromParent.get(childId);
|
|
162
|
+
if (rel) {
|
|
163
|
+
// Render as continuation relationship
|
|
164
|
+
serializeChildWithRelationship(childNode, rel, depth + 1, lines, ctx);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Render as plain indented child
|
|
168
|
+
serializeNode(childNode, depth + 1, lines, ctx);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Render non-child outgoing relationships
|
|
173
|
+
renderNonChildRelationships(node, depth, prefix, lines, ctx);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Render a node's outgoing relationships where the target is NOT a child.
|
|
177
|
+
* Shared by serializeNode and serializeChildWithRelationship for chain support.
|
|
178
|
+
*/
|
|
179
|
+
function renderNonChildRelationships(node, depth, prefix, lines, ctx) {
|
|
180
|
+
const rels = ctx.relsBySource.get(node.id) ?? [];
|
|
181
|
+
const childSet = new Set(node.children ?? []);
|
|
182
|
+
const nonChildRels = rels.filter(r => !childSet.has(r.target));
|
|
183
|
+
// Skip alternative relationships — handled by children rendering
|
|
184
|
+
const meaningfulRels = nonChildRels.filter(r => r.type !== 'alternative');
|
|
185
|
+
for (const rel of meaningfulRels) {
|
|
186
|
+
const targetNode = ctx.nodeMap.get(rel.target);
|
|
187
|
+
if (!targetNode)
|
|
188
|
+
continue;
|
|
189
|
+
// Skip if target is a child (handled above) or already rendered elsewhere
|
|
190
|
+
if (ctx.isChild.has(rel.target) || ctx.rendered.has(rel.target))
|
|
191
|
+
continue;
|
|
192
|
+
// Recursively render target with its own children and relationships
|
|
193
|
+
serializeChildWithRelationship(targetNode, rel, depth + 1, lines, ctx);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function serializeChildWithRelationship(node, rel, depth, lines, ctx) {
|
|
197
|
+
ctx.rendered.add(node.id);
|
|
198
|
+
const prefix = ctx.indent.repeat(depth);
|
|
199
|
+
// State markers: separate vs inline based on provenance
|
|
200
|
+
const states = ctx.statesByNode.get(node.id) ?? [];
|
|
201
|
+
const separateStates = [];
|
|
202
|
+
const inlineStates = [];
|
|
203
|
+
for (const state of states) {
|
|
204
|
+
if (state.provenance.line_number < node.provenance.line_number) {
|
|
205
|
+
separateStates.push(state);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
inlineStates.push(state);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Render separate state markers on their own lines
|
|
212
|
+
for (const state of separateStates) {
|
|
213
|
+
lines.push(prefix + renderState(state));
|
|
214
|
+
}
|
|
215
|
+
// Modifiers
|
|
216
|
+
const modifiers = renderModifiers(node.modifiers);
|
|
217
|
+
const inlineStateStr = renderStates(inlineStates);
|
|
218
|
+
// For continuation relationships, render both the relationship operator AND
|
|
219
|
+
// the type prefix when the node has one. The grammar supports typed targets
|
|
220
|
+
// in relationship expressions (e.g., `-> thought: content`, `-> action: do X`).
|
|
221
|
+
const typePrefix = renderTypePrefix(node.type);
|
|
222
|
+
const relOp = renderRelOp(rel);
|
|
223
|
+
let line;
|
|
224
|
+
if (rel.type === 'alternative' && node.type === 'alternative') {
|
|
225
|
+
// Alternative relationships: || serves as both relationship AND type prefix
|
|
226
|
+
// Render just the type prefix to avoid `|| || content`
|
|
227
|
+
line = prefix + modifiers + inlineStateStr + typePrefix + node.content;
|
|
228
|
+
}
|
|
229
|
+
else if (typePrefix && node.type !== 'statement') {
|
|
230
|
+
// Typed node with relationship: render both operator and type prefix
|
|
231
|
+
// e.g., `-> thought: content`, `-> action: do X`, `-> ✓ done`
|
|
232
|
+
line = prefix + modifiers + inlineStateStr + relOp + ' ' + typePrefix + node.content;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// Plain statement: render with relationship operator only
|
|
236
|
+
line = prefix + modifiers + inlineStateStr + relOp + ' ' + node.content;
|
|
237
|
+
}
|
|
238
|
+
lines.push(line);
|
|
239
|
+
// Recursively render this node's children
|
|
240
|
+
if (node.children && node.children.length > 0) {
|
|
241
|
+
for (const childId of node.children) {
|
|
242
|
+
const childNode = ctx.nodeMap.get(childId);
|
|
243
|
+
if (!childNode)
|
|
244
|
+
continue;
|
|
245
|
+
const childRel = ctx.childRelFromParent.get(childId);
|
|
246
|
+
if (childRel) {
|
|
247
|
+
serializeChildWithRelationship(childNode, childRel, depth + 1, lines, ctx);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
serializeNode(childNode, depth + 1, lines, ctx);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Render this node's own non-child outgoing relationships (for chaining: A -> B -> C)
|
|
255
|
+
renderNonChildRelationships(node, depth, prefix, lines, ctx);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Render modifier prefixes.
|
|
259
|
+
* Modifiers: "urgent" → "!", "strong_positive" → "++", etc.
|
|
260
|
+
*/
|
|
261
|
+
function renderModifiers(modifiers) {
|
|
262
|
+
if (!modifiers || modifiers.length === 0)
|
|
263
|
+
return '';
|
|
264
|
+
return modifiers.map(m => {
|
|
265
|
+
switch (m) {
|
|
266
|
+
case 'urgent': return '! ';
|
|
267
|
+
case 'strong_positive': return '++ ';
|
|
268
|
+
case 'high_confidence': return '* ';
|
|
269
|
+
case 'low_confidence': return '~ ';
|
|
270
|
+
default: return m + ' ';
|
|
271
|
+
}
|
|
272
|
+
}).join('');
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Render state markers.
|
|
276
|
+
*/
|
|
277
|
+
function renderStates(states) {
|
|
278
|
+
if (states.length === 0)
|
|
279
|
+
return '';
|
|
280
|
+
return states.map(renderState).join(' ') + ' ';
|
|
281
|
+
}
|
|
282
|
+
function renderState(state) {
|
|
283
|
+
switch (state.type) {
|
|
284
|
+
case 'decided': {
|
|
285
|
+
const fields = renderStateFields(state, ['rationale', 'on']);
|
|
286
|
+
return fields ? `[decided(${fields})]` : '[decided]';
|
|
287
|
+
}
|
|
288
|
+
case 'blocked': {
|
|
289
|
+
const fields = renderStateFields(state, ['reason', 'since']);
|
|
290
|
+
return fields ? `[blocked(${fields})]` : '[blocked]';
|
|
291
|
+
}
|
|
292
|
+
case 'parking': {
|
|
293
|
+
const fields = renderStateFields(state, ['why', 'until']);
|
|
294
|
+
return fields ? `[parking(${fields})]` : '[parking]';
|
|
295
|
+
}
|
|
296
|
+
case 'exploring':
|
|
297
|
+
return '[exploring]';
|
|
298
|
+
default: {
|
|
299
|
+
// Generic passthrough for unknown state types (e.g., 'completed')
|
|
300
|
+
// Preserves all fields rather than silently dropping them
|
|
301
|
+
const fields = renderGenericStateFields(state);
|
|
302
|
+
return fields ? `[${state.type}(${fields})]` : `[${state.type}]`;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function renderStateFields(state, fieldOrder) {
|
|
307
|
+
const parts = [];
|
|
308
|
+
for (const key of fieldOrder) {
|
|
309
|
+
const value = state.fields[key];
|
|
310
|
+
if (value !== undefined) {
|
|
311
|
+
parts.push(`${key}: "${value}"`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return parts.join(', ');
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Render all fields generically (for unknown state types).
|
|
318
|
+
*/
|
|
319
|
+
function renderGenericStateFields(state) {
|
|
320
|
+
const entries = Object.entries(state.fields);
|
|
321
|
+
if (entries.length === 0)
|
|
322
|
+
return '';
|
|
323
|
+
return entries.map(([key, value]) => `${key}: "${value}"`).join(', ');
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Render the type prefix for a node.
|
|
327
|
+
* Known types that have no FlowScript syntax render as plain text (empty prefix).
|
|
328
|
+
*/
|
|
329
|
+
function renderTypePrefix(type) {
|
|
330
|
+
switch (type) {
|
|
331
|
+
case 'question': return '? ';
|
|
332
|
+
case 'thought': return 'thought: ';
|
|
333
|
+
case 'action': return 'action: ';
|
|
334
|
+
case 'completion': return '✓ ';
|
|
335
|
+
case 'alternative': return '|| ';
|
|
336
|
+
case 'statement': return '';
|
|
337
|
+
case 'block': return '';
|
|
338
|
+
case 'decision': return '';
|
|
339
|
+
case 'blocker': return '';
|
|
340
|
+
case 'insight': return '';
|
|
341
|
+
case 'exploring': return '';
|
|
342
|
+
case 'parking': return '';
|
|
343
|
+
default: return '';
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Render a relationship operator.
|
|
348
|
+
*/
|
|
349
|
+
function renderRelOp(rel) {
|
|
350
|
+
switch (rel.type) {
|
|
351
|
+
case 'causes': return '->';
|
|
352
|
+
case 'temporal': return '=>';
|
|
353
|
+
case 'derives_from': return '<-';
|
|
354
|
+
case 'bidirectional': return '<->';
|
|
355
|
+
case 'tension':
|
|
356
|
+
return rel.axis_label ? `><[${rel.axis_label}]` : '><';
|
|
357
|
+
case 'equivalent': return '=';
|
|
358
|
+
case 'different': return '!=';
|
|
359
|
+
case 'alternative': return '||';
|
|
360
|
+
// No distinct syntax exists yet for worse/better alternatives — serialize as ||
|
|
361
|
+
// Programmatic IRs using these types will lose the distinction on round-trip
|
|
362
|
+
case 'alternative_worse': return '||';
|
|
363
|
+
case 'alternative_better': return '||';
|
|
364
|
+
default:
|
|
365
|
+
throw new Error(`Unknown relationship type: ${rel.type}. Update serializer to handle this type.`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlowScript Tokenizer
|
|
3
|
+
*
|
|
4
|
+
* Regex-based tokenizer that identifies 21 FlowScript markers in source text.
|
|
5
|
+
* This is an MVP implementation - production version will use PEG parser (Phase 3).
|
|
6
|
+
*/
|
|
7
|
+
import { Token } from './types';
|
|
8
|
+
export declare class Tokenizer {
|
|
9
|
+
private input;
|
|
10
|
+
private position;
|
|
11
|
+
private line;
|
|
12
|
+
private column;
|
|
13
|
+
constructor(input: string);
|
|
14
|
+
tokenize(): Token[];
|
|
15
|
+
private nextToken;
|
|
16
|
+
private tryStateMarker;
|
|
17
|
+
private readText;
|
|
18
|
+
private isMarkerStart;
|
|
19
|
+
private match;
|
|
20
|
+
private peek;
|
|
21
|
+
private advance;
|
|
22
|
+
private skipWhitespace;
|
|
23
|
+
private isEOF;
|
|
24
|
+
private createToken;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=tokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAa,MAAM,SAAS,CAAC;AAE3C,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;gBAEf,KAAK,EAAE,MAAM;IAIzB,QAAQ,IAAI,KAAK,EAAE;IAYnB,OAAO,CAAC,SAAS;IAuEjB,OAAO,CAAC,cAAc;IAoDtB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,WAAW;CAQpB"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FlowScript Tokenizer
|
|
4
|
+
*
|
|
5
|
+
* Regex-based tokenizer that identifies 21 FlowScript markers in source text.
|
|
6
|
+
* This is an MVP implementation - production version will use PEG parser (Phase 3).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.Tokenizer = void 0;
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
class Tokenizer {
|
|
12
|
+
constructor(input) {
|
|
13
|
+
this.position = 0;
|
|
14
|
+
this.line = 1;
|
|
15
|
+
this.column = 1;
|
|
16
|
+
this.input = input;
|
|
17
|
+
}
|
|
18
|
+
tokenize() {
|
|
19
|
+
const tokens = [];
|
|
20
|
+
while (!this.isEOF()) {
|
|
21
|
+
const token = this.nextToken();
|
|
22
|
+
if (token)
|
|
23
|
+
tokens.push(token);
|
|
24
|
+
}
|
|
25
|
+
tokens.push(this.createToken(types_1.TokenType.EOF, ''));
|
|
26
|
+
return tokens;
|
|
27
|
+
}
|
|
28
|
+
nextToken() {
|
|
29
|
+
this.skipWhitespace();
|
|
30
|
+
if (this.isEOF())
|
|
31
|
+
return null;
|
|
32
|
+
// Try multi-character markers first (order matters!)
|
|
33
|
+
if (this.match('<->'))
|
|
34
|
+
return this.createToken(types_1.TokenType.ARROW_BI, '<->');
|
|
35
|
+
if (this.match('->'))
|
|
36
|
+
return this.createToken(types_1.TokenType.ARROW_RIGHT, '->');
|
|
37
|
+
if (this.match('<-'))
|
|
38
|
+
return this.createToken(types_1.TokenType.ARROW_LEFT, '<-');
|
|
39
|
+
if (this.match('=>'))
|
|
40
|
+
return this.createToken(types_1.TokenType.ARROW_TEMPORAL, '=>');
|
|
41
|
+
if (this.match('><'))
|
|
42
|
+
return this.createToken(types_1.TokenType.TENSION, '><');
|
|
43
|
+
if (this.match('!='))
|
|
44
|
+
return this.createToken(types_1.TokenType.NOT_EQUALS, '!=');
|
|
45
|
+
if (this.match('++'))
|
|
46
|
+
return this.createToken(types_1.TokenType.POSITIVE, '++');
|
|
47
|
+
if (this.match('||'))
|
|
48
|
+
return this.createToken(types_1.TokenType.ALTERNATIVE, '||');
|
|
49
|
+
// State markers (look for pattern [word])
|
|
50
|
+
if (this.peek() === '[') {
|
|
51
|
+
const stateToken = this.tryStateMarker();
|
|
52
|
+
if (stateToken)
|
|
53
|
+
return stateToken;
|
|
54
|
+
}
|
|
55
|
+
// Keywords
|
|
56
|
+
if (this.match('thought:'))
|
|
57
|
+
return this.createToken(types_1.TokenType.THOUGHT, 'thought:');
|
|
58
|
+
if (this.match('action:'))
|
|
59
|
+
return this.createToken(types_1.TokenType.ACTION, 'action:');
|
|
60
|
+
// Single character markers
|
|
61
|
+
if (this.peek() === '?') {
|
|
62
|
+
this.advance();
|
|
63
|
+
return this.createToken(types_1.TokenType.QUESTION, '?');
|
|
64
|
+
}
|
|
65
|
+
if (this.peek() === '!') {
|
|
66
|
+
this.advance();
|
|
67
|
+
return this.createToken(types_1.TokenType.URGENT, '!');
|
|
68
|
+
}
|
|
69
|
+
if (this.peek() === '*') {
|
|
70
|
+
this.advance();
|
|
71
|
+
return this.createToken(types_1.TokenType.CONFIDENT, '*');
|
|
72
|
+
}
|
|
73
|
+
if (this.peek() === '~') {
|
|
74
|
+
this.advance();
|
|
75
|
+
return this.createToken(types_1.TokenType.UNCERTAIN, '~');
|
|
76
|
+
}
|
|
77
|
+
if (this.peek() === '=') {
|
|
78
|
+
this.advance();
|
|
79
|
+
return this.createToken(types_1.TokenType.EQUALS, '=');
|
|
80
|
+
}
|
|
81
|
+
if (this.peek() === '{') {
|
|
82
|
+
this.advance();
|
|
83
|
+
return this.createToken(types_1.TokenType.BRACE_OPEN, '{');
|
|
84
|
+
}
|
|
85
|
+
if (this.peek() === '}') {
|
|
86
|
+
this.advance();
|
|
87
|
+
return this.createToken(types_1.TokenType.BRACE_CLOSE, '}');
|
|
88
|
+
}
|
|
89
|
+
if (this.peek() === '✓') {
|
|
90
|
+
this.advance();
|
|
91
|
+
return this.createToken(types_1.TokenType.CHECKMARK, '✓');
|
|
92
|
+
}
|
|
93
|
+
// Newlines
|
|
94
|
+
if (this.peek() === '\n') {
|
|
95
|
+
this.advance();
|
|
96
|
+
this.line++;
|
|
97
|
+
this.column = 1;
|
|
98
|
+
return this.createToken(types_1.TokenType.NEWLINE, '\n');
|
|
99
|
+
}
|
|
100
|
+
// Text content (everything else)
|
|
101
|
+
return this.readText();
|
|
102
|
+
}
|
|
103
|
+
tryStateMarker() {
|
|
104
|
+
const start = this.position;
|
|
105
|
+
const startCol = this.column;
|
|
106
|
+
const startLine = this.line;
|
|
107
|
+
if (this.peek() !== '[')
|
|
108
|
+
return null;
|
|
109
|
+
this.advance(); // consume '['
|
|
110
|
+
// Read until ']' or '(' to get the state type
|
|
111
|
+
let stateType = '';
|
|
112
|
+
while (!this.isEOF() && this.peek() !== ']' && this.peek() !== '(') {
|
|
113
|
+
stateType += this.peek();
|
|
114
|
+
this.advance();
|
|
115
|
+
}
|
|
116
|
+
// Check if valid state marker
|
|
117
|
+
const validStates = ['decided', 'exploring', 'blocked', 'parking'];
|
|
118
|
+
if (!validStates.includes(stateType)) {
|
|
119
|
+
// Not a state marker, reset and return null
|
|
120
|
+
this.position = start;
|
|
121
|
+
this.column = startCol;
|
|
122
|
+
this.line = startLine;
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
// Read until closing ']' (capturing any fields like (field: "value"))
|
|
126
|
+
let fullMarker = '[' + stateType;
|
|
127
|
+
while (!this.isEOF() && this.peek() !== ']') {
|
|
128
|
+
fullMarker += this.peek();
|
|
129
|
+
this.advance();
|
|
130
|
+
}
|
|
131
|
+
if (this.peek() === ']') {
|
|
132
|
+
fullMarker += ']';
|
|
133
|
+
this.advance();
|
|
134
|
+
}
|
|
135
|
+
const tokenType = {
|
|
136
|
+
'decided': types_1.TokenType.DECIDED,
|
|
137
|
+
'exploring': types_1.TokenType.EXPLORING,
|
|
138
|
+
'blocked': types_1.TokenType.BLOCKED,
|
|
139
|
+
'parking': types_1.TokenType.PARKING
|
|
140
|
+
}[stateType];
|
|
141
|
+
return {
|
|
142
|
+
type: tokenType,
|
|
143
|
+
value: fullMarker,
|
|
144
|
+
line: startLine,
|
|
145
|
+
column: startCol
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
readText() {
|
|
149
|
+
const startLine = this.line;
|
|
150
|
+
const startCol = this.column;
|
|
151
|
+
let content = '';
|
|
152
|
+
while (!this.isEOF() && !this.isMarkerStart()) {
|
|
153
|
+
if (this.peek() === '\n')
|
|
154
|
+
break;
|
|
155
|
+
content += this.peek();
|
|
156
|
+
this.advance();
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
type: types_1.TokenType.TEXT,
|
|
160
|
+
value: content.trim(),
|
|
161
|
+
line: startLine,
|
|
162
|
+
column: startCol
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
isMarkerStart() {
|
|
166
|
+
const char = this.peek();
|
|
167
|
+
const twoChar = this.input.substr(this.position, 2);
|
|
168
|
+
// Check for multi-character markers
|
|
169
|
+
if (twoChar === '->' || twoChar === '<-' || twoChar === '<>' ||
|
|
170
|
+
twoChar === '=>' || twoChar === '><' || twoChar === '!=' ||
|
|
171
|
+
twoChar === '++' || twoChar === '||') {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
// Check for single-character markers
|
|
175
|
+
const markers = ['-', '<', '>', '=', '!', '?', '*', '~', '{', '}', '[', '|', '+', '✓'];
|
|
176
|
+
return markers.includes(char);
|
|
177
|
+
}
|
|
178
|
+
match(expected) {
|
|
179
|
+
if (this.input.substr(this.position, expected.length) === expected) {
|
|
180
|
+
const startCol = this.column;
|
|
181
|
+
for (let i = 0; i < expected.length; i++) {
|
|
182
|
+
this.advance();
|
|
183
|
+
}
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
peek() {
|
|
189
|
+
return this.input[this.position] || '';
|
|
190
|
+
}
|
|
191
|
+
advance() {
|
|
192
|
+
this.position++;
|
|
193
|
+
this.column++;
|
|
194
|
+
}
|
|
195
|
+
skipWhitespace() {
|
|
196
|
+
while (!this.isEOF() && /[ \t\r]/.test(this.peek())) {
|
|
197
|
+
this.advance();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
isEOF() {
|
|
201
|
+
return this.position >= this.input.length;
|
|
202
|
+
}
|
|
203
|
+
createToken(type, value) {
|
|
204
|
+
return {
|
|
205
|
+
type,
|
|
206
|
+
value,
|
|
207
|
+
line: this.line,
|
|
208
|
+
column: this.column - value.length
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.Tokenizer = Tokenizer;
|
|
213
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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"}
|