dsh-plugin-prompt-tool 0.4.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +131 -222
  2. package/engine/anchor-match.mjs +117 -0
  3. package/engine/compaction-epoch.mjs +139 -0
  4. package/engine/compositions/library/bootstrap-filesystem.yml +19 -0
  5. package/engine/compositions/library/compaction.yml +52 -0
  6. package/engine/compositions/library/context-gate.yml +40 -0
  7. package/engine/compositions/library/custom-bash.yml +14 -0
  8. package/engine/compositions/library/delegation.yml +85 -0
  9. package/engine/compositions/library/official-agent-instructions.yml +17 -0
  10. package/engine/compositions/library/official-persistent-shell.yml +56 -0
  11. package/engine/compositions/library/official-skill-filesystem-cordis.yml +10 -0
  12. package/engine/compositions/library/official-tool-bash.yml +6 -0
  13. package/engine/compositions/library/official-tool-cordis.yml +13 -0
  14. package/engine/compositions/library/official-tool-presentation.yml +7 -0
  15. package/engine/compositions/library/official-tool-skill.yml +14 -0
  16. package/engine/compositions/library/persistent-shell.yml +36 -0
  17. package/engine/compositions/library/persona.yml +9 -0
  18. package/engine/compositions/library/planning.yml +41 -0
  19. package/engine/compositions/library/prompt-config-engine.yml +16 -0
  20. package/engine/compositions/library/run-code-env.yml +15 -0
  21. package/engine/compositions/library/skill-filesystem.yml +13 -0
  22. package/engine/compositions/library/skill-search.yml +14 -0
  23. package/engine/compositions/library/str-replace-editor.yml +10 -0
  24. package/engine/compositions/library/tool-ask-user.yml +8 -0
  25. package/engine/compositions/library/tool-bash.yml +16 -0
  26. package/engine/compositions/library/tool-bootstrap.yml +16 -0
  27. package/engine/compositions/library/tool-filter.yml +12 -0
  28. package/engine/compositions/library/tool-fs-search.yml +18 -0
  29. package/engine/compositions/library/tool-fs.yml +10 -0
  30. package/engine/compositions/library/tool-goal.yml +19 -0
  31. package/engine/compositions/library/tool-jobs.yml +23 -0
  32. package/engine/compositions/library/tool-pwsh.yml +12 -0
  33. package/engine/compositions/library/tool-todo.yml +11 -0
  34. package/engine/compositions/library/tool-web.yml +9 -0
  35. package/engine/compositions/source/local/context-gate.yml +37 -0
  36. package/engine/compositions/source/local/custom-bash.yml +11 -0
  37. package/engine/compositions/source/local/prompt-config-engine.yml +13 -0
  38. package/engine/compositions/source/local/run-code-env.yml +12 -0
  39. package/engine/compositions/source/local/skill-search.yml +11 -0
  40. package/engine/compositions/source/local/tool-bootstrap.yml +13 -0
  41. package/engine/context-gate.mjs +305 -0
  42. package/{preset → engine}/custom-bash.mjs +243 -243
  43. package/engine/executor.mjs +278 -0
  44. package/engine/fillers.mjs +273 -0
  45. package/engine/interpolate.mjs +66 -0
  46. package/engine/layers.mjs +224 -0
  47. package/engine/prompt-config-engine.mjs +49 -0
  48. package/engine/run-code-env.mjs +208 -0
  49. package/engine/schema.mjs +312 -0
  50. package/engine/session-vars.mjs +52 -0
  51. package/{preset → engine}/shared.mjs +35 -0
  52. package/engine/strategies.mjs +213 -0
  53. package/{preset → engine}/tool-bootstrap.mjs +350 -282
  54. package/engine/tool-filter.mjs +80 -0
  55. package/engine/vendor/yaml/LICENSE +13 -0
  56. package/engine/vendor/yaml/dist/compose/compose-collection.js +88 -0
  57. package/engine/vendor/yaml/dist/compose/compose-doc.js +43 -0
  58. package/engine/vendor/yaml/dist/compose/compose-node.js +109 -0
  59. package/engine/vendor/yaml/dist/compose/compose-scalar.js +86 -0
  60. package/engine/vendor/yaml/dist/compose/composer.js +219 -0
  61. package/engine/vendor/yaml/dist/compose/resolve-block-map.js +115 -0
  62. package/engine/vendor/yaml/dist/compose/resolve-block-scalar.js +198 -0
  63. package/engine/vendor/yaml/dist/compose/resolve-block-seq.js +49 -0
  64. package/engine/vendor/yaml/dist/compose/resolve-end.js +37 -0
  65. package/engine/vendor/yaml/dist/compose/resolve-flow-collection.js +207 -0
  66. package/engine/vendor/yaml/dist/compose/resolve-flow-scalar.js +225 -0
  67. package/engine/vendor/yaml/dist/compose/resolve-props.js +146 -0
  68. package/engine/vendor/yaml/dist/compose/util-contains-newline.js +34 -0
  69. package/engine/vendor/yaml/dist/compose/util-empty-scalar-position.js +26 -0
  70. package/engine/vendor/yaml/dist/compose/util-flow-indent-check.js +15 -0
  71. package/engine/vendor/yaml/dist/compose/util-map-includes.js +13 -0
  72. package/engine/vendor/yaml/dist/doc/Document.js +335 -0
  73. package/engine/vendor/yaml/dist/doc/anchors.js +71 -0
  74. package/engine/vendor/yaml/dist/doc/applyReviver.js +55 -0
  75. package/engine/vendor/yaml/dist/doc/createNode.js +88 -0
  76. package/engine/vendor/yaml/dist/doc/directives.js +176 -0
  77. package/engine/vendor/yaml/dist/errors.js +57 -0
  78. package/engine/vendor/yaml/dist/index.js +17 -0
  79. package/engine/vendor/yaml/dist/log.js +11 -0
  80. package/engine/vendor/yaml/dist/nodes/Alias.js +116 -0
  81. package/engine/vendor/yaml/dist/nodes/Collection.js +147 -0
  82. package/engine/vendor/yaml/dist/nodes/Node.js +38 -0
  83. package/engine/vendor/yaml/dist/nodes/Pair.js +36 -0
  84. package/engine/vendor/yaml/dist/nodes/Scalar.js +24 -0
  85. package/engine/vendor/yaml/dist/nodes/YAMLMap.js +144 -0
  86. package/engine/vendor/yaml/dist/nodes/YAMLSeq.js +113 -0
  87. package/engine/vendor/yaml/dist/nodes/addPairToJSMap.js +63 -0
  88. package/engine/vendor/yaml/dist/nodes/identity.js +36 -0
  89. package/engine/vendor/yaml/dist/nodes/toJS.js +37 -0
  90. package/engine/vendor/yaml/dist/parse/cst-scalar.js +214 -0
  91. package/engine/vendor/yaml/dist/parse/cst-stringify.js +61 -0
  92. package/engine/vendor/yaml/dist/parse/cst-visit.js +97 -0
  93. package/engine/vendor/yaml/dist/parse/cst.js +98 -0
  94. package/engine/vendor/yaml/dist/parse/lexer.js +721 -0
  95. package/engine/vendor/yaml/dist/parse/line-counter.js +39 -0
  96. package/engine/vendor/yaml/dist/parse/parser.js +975 -0
  97. package/engine/vendor/yaml/dist/public-api.js +102 -0
  98. package/engine/vendor/yaml/dist/schema/Schema.js +37 -0
  99. package/engine/vendor/yaml/dist/schema/common/map.js +17 -0
  100. package/engine/vendor/yaml/dist/schema/common/null.js +15 -0
  101. package/engine/vendor/yaml/dist/schema/common/seq.js +17 -0
  102. package/engine/vendor/yaml/dist/schema/common/string.js +14 -0
  103. package/engine/vendor/yaml/dist/schema/core/bool.js +19 -0
  104. package/engine/vendor/yaml/dist/schema/core/float.js +43 -0
  105. package/engine/vendor/yaml/dist/schema/core/int.js +38 -0
  106. package/engine/vendor/yaml/dist/schema/core/schema.js +23 -0
  107. package/engine/vendor/yaml/dist/schema/json/schema.js +62 -0
  108. package/engine/vendor/yaml/dist/schema/tags.js +96 -0
  109. package/engine/vendor/yaml/dist/schema/yaml-1.1/binary.js +58 -0
  110. package/engine/vendor/yaml/dist/schema/yaml-1.1/bool.js +26 -0
  111. package/engine/vendor/yaml/dist/schema/yaml-1.1/float.js +46 -0
  112. package/engine/vendor/yaml/dist/schema/yaml-1.1/int.js +71 -0
  113. package/engine/vendor/yaml/dist/schema/yaml-1.1/merge.js +67 -0
  114. package/engine/vendor/yaml/dist/schema/yaml-1.1/omap.js +74 -0
  115. package/engine/vendor/yaml/dist/schema/yaml-1.1/pairs.js +78 -0
  116. package/engine/vendor/yaml/dist/schema/yaml-1.1/schema.js +39 -0
  117. package/engine/vendor/yaml/dist/schema/yaml-1.1/set.js +93 -0
  118. package/engine/vendor/yaml/dist/schema/yaml-1.1/timestamp.js +101 -0
  119. package/engine/vendor/yaml/dist/stringify/foldFlowLines.js +146 -0
  120. package/engine/vendor/yaml/dist/stringify/stringify.js +129 -0
  121. package/engine/vendor/yaml/dist/stringify/stringifyCollection.js +153 -0
  122. package/engine/vendor/yaml/dist/stringify/stringifyComment.js +20 -0
  123. package/engine/vendor/yaml/dist/stringify/stringifyDocument.js +85 -0
  124. package/engine/vendor/yaml/dist/stringify/stringifyNumber.js +25 -0
  125. package/engine/vendor/yaml/dist/stringify/stringifyPair.js +150 -0
  126. package/engine/vendor/yaml/dist/stringify/stringifyString.js +336 -0
  127. package/engine/vendor/yaml/dist/util.js +11 -0
  128. package/engine/vendor/yaml/dist/visit.js +233 -0
  129. package/engine/vendor/yaml/index.js +5 -0
  130. package/engine/vendor/yaml/package.json +11 -0
  131. package/lib/client.js +4724 -775
  132. package/lib/client.js.map +1 -1
  133. package/lib/index.d.mts +530 -51
  134. package/lib/index.mjs +4164 -740
  135. package/lib/preset-core.d.mts +7 -37
  136. package/lib/preset-core.mjs +43 -285
  137. package/lib/prompt-configs-B4vH09wx.d.mts +100 -0
  138. package/lib/prompt-configs-ThS4iXPg.mjs +771 -0
  139. package/package.json +36 -29
  140. package/preset/anchored/preset.yml +342 -0
  141. package/preset/creative/preset.yml +65 -0
  142. package/preset/creative/skills/cordis-plugin-development/SKILL.md +420 -0
  143. package/preset/creative/skills/editing-cordis-compositions/SKILL.md +165 -0
  144. package/preset/custom/preset.yml +13 -0
  145. package/preset/liangshen/preset.yml +72 -0
  146. package/preset/minimal/preset.yml +44 -0
  147. package/preset/ptc/preset.yml +56 -0
  148. package/preset/standard/preset.yml +55 -0
  149. package/skills/manifest.json +7 -0
  150. package/skills/sandboxmod/SKILL.md +49 -49
  151. package/skills/web ui/SKILL.md +42 -0
  152. package/templates/10-pre-step.yml +28 -0
  153. package/templates/11-merged-a.yml +11 -0
  154. package/templates/13-anchor.yml +19 -0
  155. package/templates/14-first-turn-anchor.yml +27 -0
  156. package/templates/15-guide-auto.yml +25 -0
  157. package/templates/16-custom-fallback.yml +21 -0
  158. package/templates/17-instruction-hint.yml +23 -0
  159. package/templates/18-placeholder-env-facts.yml +11 -0
  160. package/templates/19-placeholder-skill-catalog.yml +19 -0
  161. package/templates/20-system-section.yml +19 -0
  162. package/templates/30-runtime-context.yml +10 -0
  163. package/templates/31-runtime-context-placeholder.yml +18 -0
  164. package/templates/40-agent-request.yml +11 -0
  165. package/templates/50-llm-stream.yml +9 -0
  166. package/templates/60-tool-pipeline.yml +12 -0
  167. package/AGENTS.md +0 -4
  168. package/plan.md +0 -312
  169. package/preset/agent.cordis.yml +0 -443
  170. package/preset/compaction-epoch.mjs +0 -81
  171. package/preset/context-gate.mjs +0 -165
  172. package/preset/instruction-hint.mjs +0 -217
  173. package/preset/near-anchor.mjs +0 -101
  174. package/preset/preset.yml +0 -3
  175. package/preset/prompt-injector.mjs +0 -112
  176. package/preset/router-first-turn.mjs +0 -73
  177. package/preset/router-guide.mjs +0 -79
  178. package/preset.md +0 -115
  179. package/upstream/dsh-anchored-standard/LICENSE +0 -22
  180. package/upstream/dsh-anchored-standard/NOTICE +0 -19
  181. package/upstream/dsh-anchored-standard/REVISION +0 -1
  182. package/upstream/dsh-anchored-standard/preset/agent.cordis.yml +0 -440
  183. package/upstream/dsh-anchored-standard/preset/compaction-epoch.mjs +0 -81
  184. package/upstream/dsh-anchored-standard/preset/context-gate.mjs +0 -202
  185. package/upstream/dsh-anchored-standard/preset/custom-bash.mjs +0 -219
  186. package/upstream/dsh-anchored-standard/preset/dev-tool-search.mjs +0 -131
  187. package/upstream/dsh-anchored-standard/preset/instruction-hint.mjs +0 -231
  188. package/upstream/dsh-anchored-standard/preset/preset.yml +0 -3
  189. package/upstream/dsh-anchored-standard/preset/skill-search.mjs +0 -142
  190. package/upstream/dsh-anchored-standard/preset/tool-bootstrap.mjs +0 -301
  191. /package/{preset → engine}/skill-search.mjs +0 -0
@@ -0,0 +1,975 @@
1
+ import { tokenType } from './cst.js';
2
+ import { Lexer } from './lexer.js';
3
+
4
+ function includesToken(list, type) {
5
+ for (let i = 0; i < list.length; ++i)
6
+ if (list[i].type === type)
7
+ return true;
8
+ return false;
9
+ }
10
+ function findNonEmptyIndex(list) {
11
+ for (let i = 0; i < list.length; ++i) {
12
+ switch (list[i].type) {
13
+ case 'space':
14
+ case 'comment':
15
+ case 'newline':
16
+ break;
17
+ default:
18
+ return i;
19
+ }
20
+ }
21
+ return -1;
22
+ }
23
+ function isFlowToken(token) {
24
+ switch (token?.type) {
25
+ case 'alias':
26
+ case 'scalar':
27
+ case 'single-quoted-scalar':
28
+ case 'double-quoted-scalar':
29
+ case 'flow-collection':
30
+ return true;
31
+ default:
32
+ return false;
33
+ }
34
+ }
35
+ function getPrevProps(parent) {
36
+ switch (parent.type) {
37
+ case 'document':
38
+ return parent.start;
39
+ case 'block-map': {
40
+ const it = parent.items[parent.items.length - 1];
41
+ return it.sep ?? it.start;
42
+ }
43
+ case 'block-seq':
44
+ return parent.items[parent.items.length - 1].start;
45
+ /* istanbul ignore next should not happen */
46
+ default:
47
+ return [];
48
+ }
49
+ }
50
+ /** Note: May modify input array */
51
+ function getFirstKeyStartProps(prev) {
52
+ if (prev.length === 0)
53
+ return [];
54
+ let i = prev.length;
55
+ loop: while (--i >= 0) {
56
+ switch (prev[i].type) {
57
+ case 'doc-start':
58
+ case 'explicit-key-ind':
59
+ case 'map-value-ind':
60
+ case 'seq-item-ind':
61
+ case 'newline':
62
+ break loop;
63
+ }
64
+ }
65
+ while (prev[++i]?.type === 'space') {
66
+ /* loop */
67
+ }
68
+ return prev.splice(i, prev.length);
69
+ }
70
+ function arrayPushArray(target, source) {
71
+ // May exhaust call stack with large `source` array
72
+ if (source.length < 1e5)
73
+ Array.prototype.push.apply(target, source);
74
+ else
75
+ for (let i = 0; i < source.length; ++i)
76
+ target.push(source[i]);
77
+ }
78
+ function fixFlowSeqItems(fc) {
79
+ if (fc.start.type === 'flow-seq-start') {
80
+ for (const it of fc.items) {
81
+ if (it.sep &&
82
+ !it.value &&
83
+ !includesToken(it.start, 'explicit-key-ind') &&
84
+ !includesToken(it.sep, 'map-value-ind')) {
85
+ if (it.key)
86
+ it.value = it.key;
87
+ delete it.key;
88
+ if (isFlowToken(it.value)) {
89
+ if (it.value.end)
90
+ arrayPushArray(it.value.end, it.sep);
91
+ else
92
+ it.value.end = it.sep;
93
+ }
94
+ else
95
+ arrayPushArray(it.start, it.sep);
96
+ delete it.sep;
97
+ }
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * A YAML concrete syntax tree (CST) parser
103
+ *
104
+ * ```ts
105
+ * const src: string = ...
106
+ * for (const token of new Parser().parse(src)) {
107
+ * // token: Token
108
+ * }
109
+ * ```
110
+ *
111
+ * To use the parser with a user-provided lexer:
112
+ *
113
+ * ```ts
114
+ * function* parse(source: string, lexer: Lexer) {
115
+ * const parser = new Parser()
116
+ * for (const lexeme of lexer.lex(source))
117
+ * yield* parser.next(lexeme)
118
+ * yield* parser.end()
119
+ * }
120
+ *
121
+ * const src: string = ...
122
+ * const lexer = new Lexer()
123
+ * for (const token of parse(src, lexer)) {
124
+ * // token: Token
125
+ * }
126
+ * ```
127
+ */
128
+ class Parser {
129
+ /**
130
+ * @param onNewLine - If defined, called separately with the start position of
131
+ * each new line (in `parse()`, including the start of input).
132
+ */
133
+ constructor(onNewLine) {
134
+ /** If true, space and sequence indicators count as indentation */
135
+ this.atNewLine = true;
136
+ /** If true, next token is a scalar value */
137
+ this.atScalar = false;
138
+ /** Current indentation level */
139
+ this.indent = 0;
140
+ /** Current offset since the start of parsing */
141
+ this.offset = 0;
142
+ /** On the same line with a block map key */
143
+ this.onKeyLine = false;
144
+ /** Top indicates the node that's currently being built */
145
+ this.stack = [];
146
+ /** The source of the current token, set in parse() */
147
+ this.source = '';
148
+ /** The type of the current token, set in parse() */
149
+ this.type = '';
150
+ // Must be defined after `next()`
151
+ this.lexer = new Lexer();
152
+ this.onNewLine = onNewLine;
153
+ }
154
+ /**
155
+ * Parse `source` as a YAML stream.
156
+ * If `incomplete`, a part of the last line may be left as a buffer for the next call.
157
+ *
158
+ * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.
159
+ *
160
+ * @returns A generator of tokens representing each directive, document, and other structure.
161
+ */
162
+ *parse(source, incomplete = false) {
163
+ if (this.onNewLine && this.offset === 0)
164
+ this.onNewLine(0);
165
+ for (const lexeme of this.lexer.lex(source, incomplete))
166
+ yield* this.next(lexeme);
167
+ if (!incomplete)
168
+ yield* this.end();
169
+ }
170
+ /**
171
+ * Advance the parser by the `source` of one lexical token.
172
+ */
173
+ *next(source) {
174
+ this.source = source;
175
+ if (this.atScalar) {
176
+ this.atScalar = false;
177
+ yield* this.step();
178
+ this.offset += source.length;
179
+ return;
180
+ }
181
+ const type = tokenType(source);
182
+ if (!type) {
183
+ const message = `Not a YAML token: ${source}`;
184
+ yield* this.pop({ type: 'error', offset: this.offset, message, source });
185
+ this.offset += source.length;
186
+ }
187
+ else if (type === 'scalar') {
188
+ this.atNewLine = false;
189
+ this.atScalar = true;
190
+ this.type = 'scalar';
191
+ }
192
+ else {
193
+ this.type = type;
194
+ yield* this.step();
195
+ switch (type) {
196
+ case 'newline':
197
+ this.atNewLine = true;
198
+ this.indent = 0;
199
+ if (this.onNewLine)
200
+ this.onNewLine(this.offset + source.length);
201
+ break;
202
+ case 'space':
203
+ if (this.atNewLine && source[0] === ' ')
204
+ this.indent += source.length;
205
+ break;
206
+ case 'explicit-key-ind':
207
+ case 'map-value-ind':
208
+ case 'seq-item-ind':
209
+ if (this.atNewLine)
210
+ this.indent += source.length;
211
+ break;
212
+ case 'doc-mode':
213
+ case 'flow-error-end':
214
+ return;
215
+ default:
216
+ this.atNewLine = false;
217
+ }
218
+ this.offset += source.length;
219
+ }
220
+ }
221
+ /** Call at end of input to push out any remaining constructions */
222
+ *end() {
223
+ while (this.stack.length > 0)
224
+ yield* this.pop();
225
+ }
226
+ get sourceToken() {
227
+ const st = {
228
+ type: this.type,
229
+ offset: this.offset,
230
+ indent: this.indent,
231
+ source: this.source
232
+ };
233
+ return st;
234
+ }
235
+ *step() {
236
+ const top = this.peek(1);
237
+ if (this.type === 'doc-end' && top?.type !== 'doc-end') {
238
+ while (this.stack.length > 0)
239
+ yield* this.pop();
240
+ this.stack.push({
241
+ type: 'doc-end',
242
+ offset: this.offset,
243
+ source: this.source
244
+ });
245
+ return;
246
+ }
247
+ if (!top)
248
+ return yield* this.stream();
249
+ switch (top.type) {
250
+ case 'document':
251
+ return yield* this.document(top);
252
+ case 'alias':
253
+ case 'scalar':
254
+ case 'single-quoted-scalar':
255
+ case 'double-quoted-scalar':
256
+ return yield* this.scalar(top);
257
+ case 'block-scalar':
258
+ return yield* this.blockScalar(top);
259
+ case 'block-map':
260
+ return yield* this.blockMap(top);
261
+ case 'block-seq':
262
+ return yield* this.blockSequence(top);
263
+ case 'flow-collection':
264
+ return yield* this.flowCollection(top);
265
+ case 'doc-end':
266
+ return yield* this.documentEnd(top);
267
+ }
268
+ /* istanbul ignore next should not happen */
269
+ yield* this.pop();
270
+ }
271
+ peek(n) {
272
+ return this.stack[this.stack.length - n];
273
+ }
274
+ *pop(error) {
275
+ const token = error ?? this.stack.pop();
276
+ /* istanbul ignore if should not happen */
277
+ if (!token) {
278
+ const message = 'Tried to pop an empty stack';
279
+ yield { type: 'error', offset: this.offset, source: '', message };
280
+ }
281
+ else if (this.stack.length === 0) {
282
+ yield token;
283
+ }
284
+ else {
285
+ const top = this.peek(1);
286
+ if (token.type === 'block-scalar') {
287
+ // Block scalars use their parent rather than header indent
288
+ token.indent = 'indent' in top ? top.indent : 0;
289
+ }
290
+ else if (token.type === 'flow-collection' && top.type === 'document') {
291
+ // Ignore all indent for top-level flow collections
292
+ token.indent = 0;
293
+ }
294
+ if (token.type === 'flow-collection')
295
+ fixFlowSeqItems(token);
296
+ switch (top.type) {
297
+ case 'document':
298
+ top.value = token;
299
+ break;
300
+ case 'block-scalar':
301
+ top.props.push(token); // error
302
+ break;
303
+ case 'block-map': {
304
+ const it = top.items[top.items.length - 1];
305
+ if (it.value) {
306
+ top.items.push({ start: [], key: token, sep: [] });
307
+ this.onKeyLine = true;
308
+ return;
309
+ }
310
+ else if (it.sep) {
311
+ it.value = token;
312
+ }
313
+ else {
314
+ Object.assign(it, { key: token, sep: [] });
315
+ this.onKeyLine = !it.explicitKey;
316
+ return;
317
+ }
318
+ break;
319
+ }
320
+ case 'block-seq': {
321
+ const it = top.items[top.items.length - 1];
322
+ if (it.value)
323
+ top.items.push({ start: [], value: token });
324
+ else
325
+ it.value = token;
326
+ break;
327
+ }
328
+ case 'flow-collection': {
329
+ const it = top.items[top.items.length - 1];
330
+ if (!it || it.value)
331
+ top.items.push({ start: [], key: token, sep: [] });
332
+ else if (it.sep)
333
+ it.value = token;
334
+ else
335
+ Object.assign(it, { key: token, sep: [] });
336
+ return;
337
+ }
338
+ /* istanbul ignore next should not happen */
339
+ default:
340
+ yield* this.pop();
341
+ yield* this.pop(token);
342
+ }
343
+ if ((top.type === 'document' ||
344
+ top.type === 'block-map' ||
345
+ top.type === 'block-seq') &&
346
+ (token.type === 'block-map' || token.type === 'block-seq')) {
347
+ const last = token.items[token.items.length - 1];
348
+ if (last &&
349
+ !last.sep &&
350
+ !last.value &&
351
+ last.start.length > 0 &&
352
+ findNonEmptyIndex(last.start) === -1 &&
353
+ (token.indent === 0 ||
354
+ last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {
355
+ if (top.type === 'document')
356
+ top.end = last.start;
357
+ else
358
+ top.items.push({ start: last.start });
359
+ token.items.splice(-1, 1);
360
+ }
361
+ }
362
+ }
363
+ }
364
+ *stream() {
365
+ switch (this.type) {
366
+ case 'directive-line':
367
+ yield { type: 'directive', offset: this.offset, source: this.source };
368
+ return;
369
+ case 'byte-order-mark':
370
+ case 'space':
371
+ case 'comment':
372
+ case 'newline':
373
+ yield this.sourceToken;
374
+ return;
375
+ case 'doc-mode':
376
+ case 'doc-start': {
377
+ const doc = {
378
+ type: 'document',
379
+ offset: this.offset,
380
+ start: []
381
+ };
382
+ if (this.type === 'doc-start')
383
+ doc.start.push(this.sourceToken);
384
+ this.stack.push(doc);
385
+ return;
386
+ }
387
+ }
388
+ yield {
389
+ type: 'error',
390
+ offset: this.offset,
391
+ message: `Unexpected ${this.type} token in YAML stream`,
392
+ source: this.source
393
+ };
394
+ }
395
+ *document(doc) {
396
+ if (doc.value)
397
+ return yield* this.lineEnd(doc);
398
+ switch (this.type) {
399
+ case 'doc-start': {
400
+ if (findNonEmptyIndex(doc.start) !== -1) {
401
+ yield* this.pop();
402
+ yield* this.step();
403
+ }
404
+ else
405
+ doc.start.push(this.sourceToken);
406
+ return;
407
+ }
408
+ case 'anchor':
409
+ case 'tag':
410
+ case 'space':
411
+ case 'comment':
412
+ case 'newline':
413
+ doc.start.push(this.sourceToken);
414
+ return;
415
+ }
416
+ const bv = this.startBlockValue(doc);
417
+ if (bv)
418
+ this.stack.push(bv);
419
+ else {
420
+ yield {
421
+ type: 'error',
422
+ offset: this.offset,
423
+ message: `Unexpected ${this.type} token in YAML document`,
424
+ source: this.source
425
+ };
426
+ }
427
+ }
428
+ *scalar(scalar) {
429
+ if (this.type === 'map-value-ind') {
430
+ const prev = getPrevProps(this.peek(2));
431
+ const start = getFirstKeyStartProps(prev);
432
+ let sep;
433
+ if (scalar.end) {
434
+ sep = scalar.end;
435
+ sep.push(this.sourceToken);
436
+ delete scalar.end;
437
+ }
438
+ else
439
+ sep = [this.sourceToken];
440
+ const map = {
441
+ type: 'block-map',
442
+ offset: scalar.offset,
443
+ indent: scalar.indent,
444
+ items: [{ start, key: scalar, sep }]
445
+ };
446
+ this.onKeyLine = true;
447
+ this.stack[this.stack.length - 1] = map;
448
+ }
449
+ else
450
+ yield* this.lineEnd(scalar);
451
+ }
452
+ *blockScalar(scalar) {
453
+ switch (this.type) {
454
+ case 'space':
455
+ case 'comment':
456
+ case 'newline':
457
+ scalar.props.push(this.sourceToken);
458
+ return;
459
+ case 'scalar':
460
+ scalar.source = this.source;
461
+ // block-scalar source includes trailing newline
462
+ this.atNewLine = true;
463
+ this.indent = 0;
464
+ if (this.onNewLine) {
465
+ let nl = this.source.indexOf('\n') + 1;
466
+ while (nl !== 0) {
467
+ this.onNewLine(this.offset + nl);
468
+ nl = this.source.indexOf('\n', nl) + 1;
469
+ }
470
+ }
471
+ yield* this.pop();
472
+ break;
473
+ /* istanbul ignore next should not happen */
474
+ default:
475
+ yield* this.pop();
476
+ yield* this.step();
477
+ }
478
+ }
479
+ *blockMap(map) {
480
+ const it = map.items[map.items.length - 1];
481
+ // it.sep is true-ish if pair already has key or : separator
482
+ switch (this.type) {
483
+ case 'newline':
484
+ this.onKeyLine = false;
485
+ if (it.value) {
486
+ const end = 'end' in it.value ? it.value.end : undefined;
487
+ const last = Array.isArray(end) ? end[end.length - 1] : undefined;
488
+ if (last?.type === 'comment')
489
+ end?.push(this.sourceToken);
490
+ else
491
+ map.items.push({ start: [this.sourceToken] });
492
+ }
493
+ else if (it.sep) {
494
+ it.sep.push(this.sourceToken);
495
+ }
496
+ else {
497
+ it.start.push(this.sourceToken);
498
+ }
499
+ return;
500
+ case 'space':
501
+ case 'comment':
502
+ if (it.value) {
503
+ map.items.push({ start: [this.sourceToken] });
504
+ }
505
+ else if (it.sep) {
506
+ it.sep.push(this.sourceToken);
507
+ }
508
+ else {
509
+ if (this.atIndentedComment(it.start, map.indent)) {
510
+ const prev = map.items[map.items.length - 2];
511
+ const end = prev?.value?.end;
512
+ if (Array.isArray(end)) {
513
+ arrayPushArray(end, it.start);
514
+ end.push(this.sourceToken);
515
+ map.items.pop();
516
+ return;
517
+ }
518
+ }
519
+ it.start.push(this.sourceToken);
520
+ }
521
+ return;
522
+ }
523
+ if (this.indent >= map.indent) {
524
+ const atMapIndent = !this.onKeyLine && this.indent === map.indent;
525
+ const atNextItem = atMapIndent &&
526
+ (it.sep || it.explicitKey) &&
527
+ this.type !== 'seq-item-ind';
528
+ // For empty nodes, assign newline-separated not indented empty tokens to following node
529
+ let start = [];
530
+ if (atNextItem && it.sep && !it.value) {
531
+ const nl = [];
532
+ for (let i = 0; i < it.sep.length; ++i) {
533
+ const st = it.sep[i];
534
+ switch (st.type) {
535
+ case 'newline':
536
+ nl.push(i);
537
+ break;
538
+ case 'space':
539
+ break;
540
+ case 'comment':
541
+ if (st.indent > map.indent)
542
+ nl.length = 0;
543
+ break;
544
+ default:
545
+ nl.length = 0;
546
+ }
547
+ }
548
+ if (nl.length >= 2)
549
+ start = it.sep.splice(nl[1]);
550
+ }
551
+ switch (this.type) {
552
+ case 'anchor':
553
+ case 'tag':
554
+ if (atNextItem || it.value) {
555
+ start.push(this.sourceToken);
556
+ map.items.push({ start });
557
+ this.onKeyLine = true;
558
+ }
559
+ else if (it.sep) {
560
+ it.sep.push(this.sourceToken);
561
+ }
562
+ else {
563
+ it.start.push(this.sourceToken);
564
+ }
565
+ return;
566
+ case 'explicit-key-ind':
567
+ if (!it.sep && !it.explicitKey) {
568
+ it.start.push(this.sourceToken);
569
+ it.explicitKey = true;
570
+ }
571
+ else if (atNextItem || it.value) {
572
+ start.push(this.sourceToken);
573
+ map.items.push({ start, explicitKey: true });
574
+ }
575
+ else {
576
+ this.stack.push({
577
+ type: 'block-map',
578
+ offset: this.offset,
579
+ indent: this.indent,
580
+ items: [{ start: [this.sourceToken], explicitKey: true }]
581
+ });
582
+ }
583
+ this.onKeyLine = true;
584
+ return;
585
+ case 'map-value-ind':
586
+ if (it.explicitKey) {
587
+ if (!it.sep) {
588
+ if (includesToken(it.start, 'newline')) {
589
+ Object.assign(it, { key: null, sep: [this.sourceToken] });
590
+ }
591
+ else {
592
+ const start = getFirstKeyStartProps(it.start);
593
+ this.stack.push({
594
+ type: 'block-map',
595
+ offset: this.offset,
596
+ indent: this.indent,
597
+ items: [{ start, key: null, sep: [this.sourceToken] }]
598
+ });
599
+ }
600
+ }
601
+ else if (it.value) {
602
+ map.items.push({ start: [], key: null, sep: [this.sourceToken] });
603
+ }
604
+ else if (includesToken(it.sep, 'map-value-ind')) {
605
+ this.stack.push({
606
+ type: 'block-map',
607
+ offset: this.offset,
608
+ indent: this.indent,
609
+ items: [{ start, key: null, sep: [this.sourceToken] }]
610
+ });
611
+ }
612
+ else if (isFlowToken(it.key) &&
613
+ !includesToken(it.sep, 'newline')) {
614
+ const start = getFirstKeyStartProps(it.start);
615
+ const key = it.key;
616
+ const sep = it.sep;
617
+ sep.push(this.sourceToken);
618
+ // @ts-expect-error type guard is wrong here
619
+ delete it.key;
620
+ // @ts-expect-error type guard is wrong here
621
+ delete it.sep;
622
+ this.stack.push({
623
+ type: 'block-map',
624
+ offset: this.offset,
625
+ indent: this.indent,
626
+ items: [{ start, key, sep }]
627
+ });
628
+ }
629
+ else if (start.length > 0) {
630
+ // Not actually at next item
631
+ it.sep = it.sep.concat(start, this.sourceToken);
632
+ }
633
+ else {
634
+ it.sep.push(this.sourceToken);
635
+ }
636
+ }
637
+ else {
638
+ if (!it.sep) {
639
+ Object.assign(it, { key: null, sep: [this.sourceToken] });
640
+ }
641
+ else if (it.value || atNextItem) {
642
+ map.items.push({ start, key: null, sep: [this.sourceToken] });
643
+ }
644
+ else if (includesToken(it.sep, 'map-value-ind')) {
645
+ this.stack.push({
646
+ type: 'block-map',
647
+ offset: this.offset,
648
+ indent: this.indent,
649
+ items: [{ start: [], key: null, sep: [this.sourceToken] }]
650
+ });
651
+ }
652
+ else {
653
+ it.sep.push(this.sourceToken);
654
+ }
655
+ }
656
+ this.onKeyLine = true;
657
+ return;
658
+ case 'alias':
659
+ case 'scalar':
660
+ case 'single-quoted-scalar':
661
+ case 'double-quoted-scalar': {
662
+ const fs = this.flowScalar(this.type);
663
+ if (atNextItem || it.value) {
664
+ map.items.push({ start, key: fs, sep: [] });
665
+ this.onKeyLine = true;
666
+ }
667
+ else if (it.sep) {
668
+ this.stack.push(fs);
669
+ }
670
+ else {
671
+ Object.assign(it, { key: fs, sep: [] });
672
+ this.onKeyLine = true;
673
+ }
674
+ return;
675
+ }
676
+ default: {
677
+ const bv = this.startBlockValue(map);
678
+ if (bv) {
679
+ if (bv.type === 'block-seq') {
680
+ if (!it.explicitKey &&
681
+ it.sep &&
682
+ !includesToken(it.sep, 'newline')) {
683
+ yield* this.pop({
684
+ type: 'error',
685
+ offset: this.offset,
686
+ message: 'Unexpected block-seq-ind on same line with key',
687
+ source: this.source
688
+ });
689
+ return;
690
+ }
691
+ }
692
+ else if (atMapIndent) {
693
+ map.items.push({ start });
694
+ }
695
+ this.stack.push(bv);
696
+ return;
697
+ }
698
+ }
699
+ }
700
+ }
701
+ yield* this.pop();
702
+ yield* this.step();
703
+ }
704
+ *blockSequence(seq) {
705
+ const it = seq.items[seq.items.length - 1];
706
+ switch (this.type) {
707
+ case 'newline':
708
+ if (it.value) {
709
+ const end = 'end' in it.value ? it.value.end : undefined;
710
+ const last = Array.isArray(end) ? end[end.length - 1] : undefined;
711
+ if (last?.type === 'comment')
712
+ end?.push(this.sourceToken);
713
+ else
714
+ seq.items.push({ start: [this.sourceToken] });
715
+ }
716
+ else
717
+ it.start.push(this.sourceToken);
718
+ return;
719
+ case 'space':
720
+ case 'comment':
721
+ if (it.value)
722
+ seq.items.push({ start: [this.sourceToken] });
723
+ else {
724
+ if (this.atIndentedComment(it.start, seq.indent)) {
725
+ const prev = seq.items[seq.items.length - 2];
726
+ const end = prev?.value?.end;
727
+ if (Array.isArray(end)) {
728
+ arrayPushArray(end, it.start);
729
+ end.push(this.sourceToken);
730
+ seq.items.pop();
731
+ return;
732
+ }
733
+ }
734
+ it.start.push(this.sourceToken);
735
+ }
736
+ return;
737
+ case 'anchor':
738
+ case 'tag':
739
+ if (it.value || this.indent <= seq.indent)
740
+ break;
741
+ it.start.push(this.sourceToken);
742
+ return;
743
+ case 'seq-item-ind':
744
+ if (this.indent !== seq.indent)
745
+ break;
746
+ if (it.value || includesToken(it.start, 'seq-item-ind'))
747
+ seq.items.push({ start: [this.sourceToken] });
748
+ else
749
+ it.start.push(this.sourceToken);
750
+ return;
751
+ }
752
+ if (this.indent > seq.indent) {
753
+ const bv = this.startBlockValue(seq);
754
+ if (bv) {
755
+ this.stack.push(bv);
756
+ return;
757
+ }
758
+ }
759
+ yield* this.pop();
760
+ yield* this.step();
761
+ }
762
+ *flowCollection(fc) {
763
+ const it = fc.items[fc.items.length - 1];
764
+ if (this.type === 'flow-error-end') {
765
+ let top;
766
+ do {
767
+ yield* this.pop();
768
+ top = this.peek(1);
769
+ } while (top?.type === 'flow-collection');
770
+ }
771
+ else if (fc.end.length === 0) {
772
+ switch (this.type) {
773
+ case 'comma':
774
+ case 'explicit-key-ind':
775
+ if (!it || it.sep)
776
+ fc.items.push({ start: [this.sourceToken] });
777
+ else
778
+ it.start.push(this.sourceToken);
779
+ return;
780
+ case 'map-value-ind':
781
+ if (!it || it.value)
782
+ fc.items.push({ start: [], key: null, sep: [this.sourceToken] });
783
+ else if (it.sep)
784
+ it.sep.push(this.sourceToken);
785
+ else
786
+ Object.assign(it, { key: null, sep: [this.sourceToken] });
787
+ return;
788
+ case 'space':
789
+ case 'comment':
790
+ case 'newline':
791
+ case 'anchor':
792
+ case 'tag':
793
+ if (!it || it.value)
794
+ fc.items.push({ start: [this.sourceToken] });
795
+ else if (it.sep)
796
+ it.sep.push(this.sourceToken);
797
+ else
798
+ it.start.push(this.sourceToken);
799
+ return;
800
+ case 'alias':
801
+ case 'scalar':
802
+ case 'single-quoted-scalar':
803
+ case 'double-quoted-scalar': {
804
+ const fs = this.flowScalar(this.type);
805
+ if (!it || it.value)
806
+ fc.items.push({ start: [], key: fs, sep: [] });
807
+ else if (it.sep)
808
+ this.stack.push(fs);
809
+ else
810
+ Object.assign(it, { key: fs, sep: [] });
811
+ return;
812
+ }
813
+ case 'flow-map-end':
814
+ case 'flow-seq-end':
815
+ fc.end.push(this.sourceToken);
816
+ return;
817
+ }
818
+ const bv = this.startBlockValue(fc);
819
+ /* istanbul ignore else should not happen */
820
+ if (bv)
821
+ this.stack.push(bv);
822
+ else {
823
+ yield* this.pop();
824
+ yield* this.step();
825
+ }
826
+ }
827
+ else {
828
+ const parent = this.peek(2);
829
+ if (parent.type === 'block-map' &&
830
+ ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||
831
+ (this.type === 'newline' &&
832
+ !parent.items[parent.items.length - 1].sep))) {
833
+ yield* this.pop();
834
+ yield* this.step();
835
+ }
836
+ else if (this.type === 'map-value-ind' &&
837
+ parent.type !== 'flow-collection') {
838
+ const prev = getPrevProps(parent);
839
+ const start = getFirstKeyStartProps(prev);
840
+ fixFlowSeqItems(fc);
841
+ const sep = fc.end.splice(1, fc.end.length);
842
+ sep.push(this.sourceToken);
843
+ const map = {
844
+ type: 'block-map',
845
+ offset: fc.offset,
846
+ indent: fc.indent,
847
+ items: [{ start, key: fc, sep }]
848
+ };
849
+ this.onKeyLine = true;
850
+ this.stack[this.stack.length - 1] = map;
851
+ }
852
+ else {
853
+ yield* this.lineEnd(fc);
854
+ }
855
+ }
856
+ }
857
+ flowScalar(type) {
858
+ if (this.onNewLine) {
859
+ let nl = this.source.indexOf('\n') + 1;
860
+ while (nl !== 0) {
861
+ this.onNewLine(this.offset + nl);
862
+ nl = this.source.indexOf('\n', nl) + 1;
863
+ }
864
+ }
865
+ return {
866
+ type,
867
+ offset: this.offset,
868
+ indent: this.indent,
869
+ source: this.source
870
+ };
871
+ }
872
+ startBlockValue(parent) {
873
+ switch (this.type) {
874
+ case 'alias':
875
+ case 'scalar':
876
+ case 'single-quoted-scalar':
877
+ case 'double-quoted-scalar':
878
+ return this.flowScalar(this.type);
879
+ case 'block-scalar-header':
880
+ return {
881
+ type: 'block-scalar',
882
+ offset: this.offset,
883
+ indent: this.indent,
884
+ props: [this.sourceToken],
885
+ source: ''
886
+ };
887
+ case 'flow-map-start':
888
+ case 'flow-seq-start':
889
+ return {
890
+ type: 'flow-collection',
891
+ offset: this.offset,
892
+ indent: this.indent,
893
+ start: this.sourceToken,
894
+ items: [],
895
+ end: []
896
+ };
897
+ case 'seq-item-ind':
898
+ return {
899
+ type: 'block-seq',
900
+ offset: this.offset,
901
+ indent: this.indent,
902
+ items: [{ start: [this.sourceToken] }]
903
+ };
904
+ case 'explicit-key-ind': {
905
+ this.onKeyLine = true;
906
+ const prev = getPrevProps(parent);
907
+ const start = getFirstKeyStartProps(prev);
908
+ start.push(this.sourceToken);
909
+ return {
910
+ type: 'block-map',
911
+ offset: this.offset,
912
+ indent: this.indent,
913
+ items: [{ start, explicitKey: true }]
914
+ };
915
+ }
916
+ case 'map-value-ind': {
917
+ this.onKeyLine = true;
918
+ const prev = getPrevProps(parent);
919
+ const start = getFirstKeyStartProps(prev);
920
+ return {
921
+ type: 'block-map',
922
+ offset: this.offset,
923
+ indent: this.indent,
924
+ items: [{ start, key: null, sep: [this.sourceToken] }]
925
+ };
926
+ }
927
+ }
928
+ return null;
929
+ }
930
+ atIndentedComment(start, indent) {
931
+ if (this.type !== 'comment')
932
+ return false;
933
+ if (this.indent <= indent)
934
+ return false;
935
+ return start.every(st => st.type === 'newline' || st.type === 'space');
936
+ }
937
+ *documentEnd(docEnd) {
938
+ if (this.type !== 'doc-mode') {
939
+ if (docEnd.end)
940
+ docEnd.end.push(this.sourceToken);
941
+ else
942
+ docEnd.end = [this.sourceToken];
943
+ if (this.type === 'newline')
944
+ yield* this.pop();
945
+ }
946
+ }
947
+ *lineEnd(token) {
948
+ switch (this.type) {
949
+ case 'comma':
950
+ case 'doc-start':
951
+ case 'doc-end':
952
+ case 'flow-seq-end':
953
+ case 'flow-map-end':
954
+ case 'map-value-ind':
955
+ yield* this.pop();
956
+ yield* this.step();
957
+ break;
958
+ case 'newline':
959
+ this.onKeyLine = false;
960
+ // fallthrough
961
+ case 'space':
962
+ case 'comment':
963
+ default:
964
+ // all other values are errors
965
+ if (token.end)
966
+ token.end.push(this.sourceToken);
967
+ else
968
+ token.end = [this.sourceToken];
969
+ if (this.type === 'newline')
970
+ yield* this.pop();
971
+ }
972
+ }
973
+ }
974
+
975
+ export { Parser };