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.
Files changed (97) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +386 -0
  3. package/bin/flowscript +12 -0
  4. package/dist/cli.d.ts +12 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +463 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/errors/indentation-error.d.ts +11 -0
  9. package/dist/errors/indentation-error.d.ts.map +1 -0
  10. package/dist/errors/indentation-error.js +22 -0
  11. package/dist/errors/indentation-error.js.map +1 -0
  12. package/dist/grammar.ohm +132 -0
  13. package/dist/hash.d.ts +21 -0
  14. package/dist/hash.d.ts.map +1 -0
  15. package/dist/hash.js +82 -0
  16. package/dist/hash.js.map +1 -0
  17. package/dist/indentation-scanner.d.ts +81 -0
  18. package/dist/indentation-scanner.d.ts.map +1 -0
  19. package/dist/indentation-scanner.js +290 -0
  20. package/dist/indentation-scanner.js.map +1 -0
  21. package/dist/index.d.ts +15 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +49 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/linter.d.ts +71 -0
  26. package/dist/linter.d.ts.map +1 -0
  27. package/dist/linter.js +122 -0
  28. package/dist/linter.js.map +1 -0
  29. package/dist/memory.d.ts +506 -0
  30. package/dist/memory.d.ts.map +1 -0
  31. package/dist/memory.js +1802 -0
  32. package/dist/memory.js.map +1 -0
  33. package/dist/parser.d.ts +53 -0
  34. package/dist/parser.d.ts.map +1 -0
  35. package/dist/parser.js +1184 -0
  36. package/dist/parser.js.map +1 -0
  37. package/dist/query-engine.d.ts +320 -0
  38. package/dist/query-engine.d.ts.map +1 -0
  39. package/dist/query-engine.js +884 -0
  40. package/dist/query-engine.js.map +1 -0
  41. package/dist/rules/alternatives-without-decision.d.ts +24 -0
  42. package/dist/rules/alternatives-without-decision.d.ts.map +1 -0
  43. package/dist/rules/alternatives-without-decision.js +58 -0
  44. package/dist/rules/alternatives-without-decision.js.map +1 -0
  45. package/dist/rules/causal-cycles.d.ts +23 -0
  46. package/dist/rules/causal-cycles.d.ts.map +1 -0
  47. package/dist/rules/causal-cycles.js +83 -0
  48. package/dist/rules/causal-cycles.js.map +1 -0
  49. package/dist/rules/deep-nesting.d.ts +23 -0
  50. package/dist/rules/deep-nesting.d.ts.map +1 -0
  51. package/dist/rules/deep-nesting.js +55 -0
  52. package/dist/rules/deep-nesting.js.map +1 -0
  53. package/dist/rules/index.d.ts +15 -0
  54. package/dist/rules/index.d.ts.map +1 -0
  55. package/dist/rules/index.js +29 -0
  56. package/dist/rules/index.js.map +1 -0
  57. package/dist/rules/invalid-syntax.d.ts +22 -0
  58. package/dist/rules/invalid-syntax.d.ts.map +1 -0
  59. package/dist/rules/invalid-syntax.js +52 -0
  60. package/dist/rules/invalid-syntax.js.map +1 -0
  61. package/dist/rules/long-causal-chains.d.ts +25 -0
  62. package/dist/rules/long-causal-chains.d.ts.map +1 -0
  63. package/dist/rules/long-causal-chains.js +75 -0
  64. package/dist/rules/long-causal-chains.js.map +1 -0
  65. package/dist/rules/missing-recommended-fields.d.ts +21 -0
  66. package/dist/rules/missing-recommended-fields.d.ts.map +1 -0
  67. package/dist/rules/missing-recommended-fields.js +45 -0
  68. package/dist/rules/missing-recommended-fields.js.map +1 -0
  69. package/dist/rules/missing-required-fields.d.ts +22 -0
  70. package/dist/rules/missing-required-fields.d.ts.map +1 -0
  71. package/dist/rules/missing-required-fields.js +46 -0
  72. package/dist/rules/missing-required-fields.js.map +1 -0
  73. package/dist/rules/orphaned-nodes.d.ts +22 -0
  74. package/dist/rules/orphaned-nodes.d.ts.map +1 -0
  75. package/dist/rules/orphaned-nodes.js +76 -0
  76. package/dist/rules/orphaned-nodes.js.map +1 -0
  77. package/dist/rules/unlabeled-tension.d.ts +20 -0
  78. package/dist/rules/unlabeled-tension.d.ts.map +1 -0
  79. package/dist/rules/unlabeled-tension.js +37 -0
  80. package/dist/rules/unlabeled-tension.js.map +1 -0
  81. package/dist/serializer.d.ts +40 -0
  82. package/dist/serializer.d.ts.map +1 -0
  83. package/dist/serializer.js +368 -0
  84. package/dist/serializer.js.map +1 -0
  85. package/dist/tokenizer.d.ts +26 -0
  86. package/dist/tokenizer.d.ts.map +1 -0
  87. package/dist/tokenizer.js +213 -0
  88. package/dist/tokenizer.js.map +1 -0
  89. package/dist/types.d.ts +96 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +50 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/validate.d.ts +18 -0
  94. package/dist/validate.d.ts.map +1 -0
  95. package/dist/validate.js +68 -0
  96. package/dist/validate.js.map +1 -0
  97. 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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"}