youmd 0.6.21 → 0.6.27

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 (218) hide show
  1. package/dist/commands/build.d.ts.map +1 -1
  2. package/dist/commands/build.js +0 -1
  3. package/dist/commands/build.js.map +1 -1
  4. package/dist/commands/chat.d.ts.map +1 -1
  5. package/dist/commands/chat.js +283 -184
  6. package/dist/commands/chat.js.map +1 -1
  7. package/dist/commands/export.d.ts +1 -0
  8. package/dist/commands/export.d.ts.map +1 -1
  9. package/dist/commands/export.js +5 -0
  10. package/dist/commands/export.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +21 -1
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/keys.d.ts.map +1 -1
  15. package/dist/commands/keys.js +3 -3
  16. package/dist/commands/keys.js.map +1 -1
  17. package/dist/commands/link.d.ts.map +1 -1
  18. package/dist/commands/link.js +3 -3
  19. package/dist/commands/link.js.map +1 -1
  20. package/dist/commands/login.d.ts +29 -0
  21. package/dist/commands/login.d.ts.map +1 -1
  22. package/dist/commands/login.js +256 -127
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/logs.js +0 -1
  25. package/dist/commands/logs.js.map +1 -1
  26. package/dist/commands/mcp.d.ts +14 -0
  27. package/dist/commands/mcp.d.ts.map +1 -1
  28. package/dist/commands/mcp.js +284 -28
  29. package/dist/commands/mcp.js.map +1 -1
  30. package/dist/commands/okf.d.ts +12 -0
  31. package/dist/commands/okf.d.ts.map +1 -0
  32. package/dist/commands/okf.js +411 -0
  33. package/dist/commands/okf.js.map +1 -0
  34. package/dist/commands/private.d.ts.map +1 -1
  35. package/dist/commands/private.js +6 -5
  36. package/dist/commands/private.js.map +1 -1
  37. package/dist/commands/project.d.ts.map +1 -1
  38. package/dist/commands/project.js +9 -5
  39. package/dist/commands/project.js.map +1 -1
  40. package/dist/commands/publish.d.ts.map +1 -1
  41. package/dist/commands/publish.js +0 -1
  42. package/dist/commands/publish.js.map +1 -1
  43. package/dist/commands/pull.d.ts +24 -1
  44. package/dist/commands/pull.d.ts.map +1 -1
  45. package/dist/commands/pull.js +114 -14
  46. package/dist/commands/pull.js.map +1 -1
  47. package/dist/commands/push.d.ts +1 -0
  48. package/dist/commands/push.d.ts.map +1 -1
  49. package/dist/commands/push.js +33 -13
  50. package/dist/commands/push.js.map +1 -1
  51. package/dist/commands/register.d.ts +6 -0
  52. package/dist/commands/register.d.ts.map +1 -1
  53. package/dist/commands/register.js +179 -79
  54. package/dist/commands/register.js.map +1 -1
  55. package/dist/commands/skill.d.ts.map +1 -1
  56. package/dist/commands/skill.js +121 -50
  57. package/dist/commands/skill.js.map +1 -1
  58. package/dist/commands/stack.d.ts +16 -0
  59. package/dist/commands/stack.d.ts.map +1 -0
  60. package/dist/commands/stack.js +863 -0
  61. package/dist/commands/stack.js.map +1 -0
  62. package/dist/commands/status.d.ts.map +1 -1
  63. package/dist/commands/status.js +25 -5
  64. package/dist/commands/status.js.map +1 -1
  65. package/dist/commands/sync.d.ts +23 -0
  66. package/dist/commands/sync.d.ts.map +1 -1
  67. package/dist/commands/sync.js +193 -12
  68. package/dist/commands/sync.js.map +1 -1
  69. package/dist/commands/whoami.d.ts.map +1 -1
  70. package/dist/commands/whoami.js +21 -16
  71. package/dist/commands/whoami.js.map +1 -1
  72. package/dist/create.js +0 -0
  73. package/dist/index.js +64 -7
  74. package/dist/index.js.map +1 -1
  75. package/dist/lib/api.d.ts +127 -5
  76. package/dist/lib/api.d.ts.map +1 -1
  77. package/dist/lib/api.js +142 -5
  78. package/dist/lib/api.js.map +1 -1
  79. package/dist/lib/ascii.d.ts +1 -0
  80. package/dist/lib/ascii.d.ts.map +1 -1
  81. package/dist/lib/ascii.js +9 -26
  82. package/dist/lib/ascii.js.map +1 -1
  83. package/dist/lib/canonical-json.d.ts +8 -0
  84. package/dist/lib/canonical-json.d.ts.map +1 -0
  85. package/dist/lib/canonical-json.js +29 -0
  86. package/dist/lib/canonical-json.js.map +1 -0
  87. package/dist/lib/capability-router.d.ts +58 -0
  88. package/dist/lib/capability-router.d.ts.map +1 -0
  89. package/dist/lib/capability-router.js +54 -0
  90. package/dist/lib/capability-router.js.map +1 -0
  91. package/dist/lib/compiler.d.ts +32 -0
  92. package/dist/lib/compiler.d.ts.map +1 -1
  93. package/dist/lib/compiler.js +150 -0
  94. package/dist/lib/compiler.js.map +1 -1
  95. package/dist/lib/config.d.ts +71 -35
  96. package/dist/lib/config.d.ts.map +1 -1
  97. package/dist/lib/config.js +334 -124
  98. package/dist/lib/config.js.map +1 -1
  99. package/dist/lib/decompile.d.ts +6 -1
  100. package/dist/lib/decompile.d.ts.map +1 -1
  101. package/dist/lib/decompile.js +120 -11
  102. package/dist/lib/decompile.js.map +1 -1
  103. package/dist/lib/hash.d.ts.map +1 -1
  104. package/dist/lib/hash.js +2 -19
  105. package/dist/lib/hash.js.map +1 -1
  106. package/dist/lib/heartbeat.d.ts +38 -0
  107. package/dist/lib/heartbeat.d.ts.map +1 -0
  108. package/dist/lib/heartbeat.js +70 -0
  109. package/dist/lib/heartbeat.js.map +1 -0
  110. package/dist/lib/host-link.d.ts +123 -0
  111. package/dist/lib/host-link.d.ts.map +1 -0
  112. package/dist/lib/host-link.js +350 -0
  113. package/dist/lib/host-link.js.map +1 -0
  114. package/dist/lib/merge.d.ts +50 -0
  115. package/dist/lib/merge.d.ts.map +1 -0
  116. package/dist/lib/merge.js +167 -0
  117. package/dist/lib/merge.js.map +1 -0
  118. package/dist/lib/okf-bundle.d.ts +104 -0
  119. package/dist/lib/okf-bundle.d.ts.map +1 -0
  120. package/dist/lib/okf-bundle.js +473 -0
  121. package/dist/lib/okf-bundle.js.map +1 -0
  122. package/dist/lib/okf-health.d.ts +40 -0
  123. package/dist/lib/okf-health.d.ts.map +1 -0
  124. package/dist/lib/okf-health.js +152 -0
  125. package/dist/lib/okf-health.js.map +1 -0
  126. package/dist/lib/okf-stack.d.ts +47 -0
  127. package/dist/lib/okf-stack.d.ts.map +1 -0
  128. package/dist/lib/okf-stack.js +331 -0
  129. package/dist/lib/okf-stack.js.map +1 -0
  130. package/dist/lib/okf-view.d.ts +49 -0
  131. package/dist/lib/okf-view.d.ts.map +1 -0
  132. package/dist/lib/okf-view.js +197 -0
  133. package/dist/lib/okf-view.js.map +1 -0
  134. package/dist/lib/okf.d.ts +130 -0
  135. package/dist/lib/okf.d.ts.map +1 -0
  136. package/dist/lib/okf.js +263 -0
  137. package/dist/lib/okf.js.map +1 -0
  138. package/dist/lib/onboarding.d.ts +17 -0
  139. package/dist/lib/onboarding.d.ts.map +1 -1
  140. package/dist/lib/onboarding.js +224 -207
  141. package/dist/lib/onboarding.js.map +1 -1
  142. package/dist/lib/project.d.ts +5 -0
  143. package/dist/lib/project.d.ts.map +1 -1
  144. package/dist/lib/project.js +8 -0
  145. package/dist/lib/project.js.map +1 -1
  146. package/dist/lib/projectContext.d.ts +201 -0
  147. package/dist/lib/projectContext.d.ts.map +1 -0
  148. package/dist/lib/projectContext.js +597 -0
  149. package/dist/lib/projectContext.js.map +1 -0
  150. package/dist/lib/render.d.ts +38 -1
  151. package/dist/lib/render.d.ts.map +1 -1
  152. package/dist/lib/render.js +83 -18
  153. package/dist/lib/render.js.map +1 -1
  154. package/dist/lib/skill-catalog.d.ts.map +1 -1
  155. package/dist/lib/skill-catalog.js +22 -2
  156. package/dist/lib/skill-catalog.js.map +1 -1
  157. package/dist/lib/skills.d.ts +20 -5
  158. package/dist/lib/skills.d.ts.map +1 -1
  159. package/dist/lib/skills.js +116 -58
  160. package/dist/lib/skills.js.map +1 -1
  161. package/dist/lib/stackEval.d.ts +87 -0
  162. package/dist/lib/stackEval.d.ts.map +1 -0
  163. package/dist/lib/stackEval.js +233 -0
  164. package/dist/lib/stackEval.js.map +1 -0
  165. package/dist/lib/stackImprove.d.ts +49 -0
  166. package/dist/lib/stackImprove.d.ts.map +1 -0
  167. package/dist/lib/stackImprove.js +313 -0
  168. package/dist/lib/stackImprove.js.map +1 -0
  169. package/dist/lib/stackInstall.d.ts +59 -0
  170. package/dist/lib/stackInstall.d.ts.map +1 -0
  171. package/dist/lib/stackInstall.js +162 -0
  172. package/dist/lib/stackInstall.js.map +1 -0
  173. package/dist/lib/stackSafety.d.ts +126 -0
  174. package/dist/lib/stackSafety.d.ts.map +1 -0
  175. package/dist/lib/stackSafety.js +486 -0
  176. package/dist/lib/stackSafety.js.map +1 -0
  177. package/dist/lib/stackUpdate.d.ts +44 -0
  178. package/dist/lib/stackUpdate.d.ts.map +1 -0
  179. package/dist/lib/stackUpdate.js +256 -0
  180. package/dist/lib/stackUpdate.js.map +1 -0
  181. package/dist/lib/stream.d.ts +116 -0
  182. package/dist/lib/stream.d.ts.map +1 -0
  183. package/dist/lib/stream.js +368 -0
  184. package/dist/lib/stream.js.map +1 -0
  185. package/dist/lib/youstack.d.ts +219 -0
  186. package/dist/lib/youstack.d.ts.map +1 -0
  187. package/dist/lib/youstack.js +1049 -0
  188. package/dist/lib/youstack.js.map +1 -0
  189. package/dist/mcp/registry.d.ts +133 -0
  190. package/dist/mcp/registry.d.ts.map +1 -0
  191. package/dist/mcp/registry.js +833 -0
  192. package/dist/mcp/registry.js.map +1 -0
  193. package/dist/mcp/server.d.ts +106 -5
  194. package/dist/mcp/server.d.ts.map +1 -1
  195. package/dist/mcp/server.js +851 -498
  196. package/dist/mcp/server.js.map +1 -1
  197. package/dist/postinstall.js +11 -2
  198. package/dist/postinstall.js.map +1 -1
  199. package/dist/you.d.ts +1 -0
  200. package/dist/you.js +40 -4
  201. package/dist/you.js.map +1 -1
  202. package/examples/youstack-bamfstack-public/docs/quickstart.md +34 -0
  203. package/examples/youstack-bamfstack-public/prompts/creator-draft-starter.md +15 -0
  204. package/examples/youstack-bamfstack-public/skills/bamfstack-start/SKILL.md +36 -0
  205. package/examples/youstack-bamfstack-public/tests/smoke.md +19 -0
  206. package/examples/youstack-bamfstack-public/workflows/creator-growth-workflow.md +22 -0
  207. package/examples/youstack-bamfstack-public/youstack.json +172 -0
  208. package/examples/youstack-personal/docs/quickstart.md +10 -0
  209. package/examples/youstack-personal/skills/youstack-start/SKILL.md +9 -0
  210. package/examples/youstack-personal/tests/smoke.md +9 -0
  211. package/examples/youstack-personal/workflows/startup.md +7 -0
  212. package/examples/youstack-personal/youstack.json +123 -0
  213. package/package.json +3 -3
  214. package/skills/claude-md-generator.md +1 -1
  215. package/skills/meta-improve.md +8 -3
  216. package/skills/proactive-context-fill.md +1 -1
  217. package/skills/youstack-maintainer.md +128 -0
  218. package/skills/youstack-start.md +78 -0
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ /**
3
+ * Streaming display utilities (U6 + U16).
4
+ *
5
+ * The You Agent embeds machine-directives in its responses as ```json fenced
6
+ * blocks (profile updates, memory saves, private updates, project updates).
7
+ * The full-text parsers in chat.ts / onboarding.ts consume those blocks AFTER
8
+ * the stream completes — but during live streaming the raw blocks used to be
9
+ * written straight to the terminal.
10
+ *
11
+ * This module provides:
12
+ * 1. JsonDirectiveStreamFilter — a pure, incremental transformer that
13
+ * suppresses ```json directive blocks from DISPLAYED output while the
14
+ * caller keeps accumulating the raw text for the post-stream parsers.
15
+ * 2. createFilteredStdoutWriter — terminal writer that applies the filter
16
+ * and shows a dim placeholder when a directive block is being swallowed
17
+ * and nothing visible has been written yet.
18
+ * 3. streamSSEText — shared SSE reader for /api/v1/chat/stream.
19
+ * 4. streamAssistantTurn — the shared spinner + stream + filter + fallback
20
+ * helper used by both `youmd chat` and onboarding turns 2+.
21
+ *
22
+ * NOTE: the transformer is mirrored (separate npm package boundaries) in
23
+ * src/hooks/stream-filter.ts for the web You Agent. A parity test in
24
+ * cli/src/__tests__/stream-filter.test.ts asserts the two never drift.
25
+ */
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.JsonDirectiveStreamFilter = exports.DIRECTIVE_SWALLOW_PLACEHOLDER = void 0;
31
+ exports.createFilteredStdoutWriter = createFilteredStdoutWriter;
32
+ exports.streamSSEText = streamSSEText;
33
+ exports.streamAssistantTurn = streamAssistantTurn;
34
+ const chalk_1 = __importDefault(require("chalk"));
35
+ const render_1 = require("./render");
36
+ /** A fence info-string longer than this can't be a json directive opener. */
37
+ const FENCE_INFO_MAX = 64;
38
+ exports.DIRECTIVE_SWALLOW_PLACEHOLDER = "(updating your profile…)";
39
+ /**
40
+ * Incremental transformer: feed(chunk) → displayable text.
41
+ *
42
+ * - Holds back a partial backtick run / undetermined fence opener at the end
43
+ * of the buffer until disambiguated (fences split across chunk boundaries).
44
+ * - Once inside a ```json fence, swallows everything until the closing fence,
45
+ * plus the whitespace run immediately after it (so no blank gap remains).
46
+ * - Non-json fences (``` alone or any other language) pass through unchanged.
47
+ * - flush() releases any held-back non-directive text at end of stream.
48
+ */
49
+ class JsonDirectiveStreamFilter {
50
+ constructor() {
51
+ this.state = "text";
52
+ /** Pending backtick run at the end of the buffer (text state). */
53
+ this.tickRun = 0;
54
+ /** Held "```<info>" while determining the fence language. */
55
+ this.fenceBuf = "";
56
+ /** Match progress for the "\n```" closing fence (json/code states). */
57
+ this.closeProgress = 0;
58
+ this.blocks = 0;
59
+ this.visible = false;
60
+ this.swallowedEver = false;
61
+ }
62
+ /** Feed a raw chunk; returns the displayable portion (may be empty). */
63
+ feed(chunk) {
64
+ let out = "";
65
+ for (let i = 0; i < chunk.length; i++) {
66
+ const ch = chunk[i];
67
+ switch (this.state) {
68
+ case "text": {
69
+ if (ch === "`") {
70
+ this.tickRun++;
71
+ if (this.tickRun === 3) {
72
+ this.tickRun = 0;
73
+ this.state = "fenceInfo";
74
+ this.fenceBuf = "```";
75
+ }
76
+ }
77
+ else {
78
+ if (this.tickRun > 0) {
79
+ out += "`".repeat(this.tickRun);
80
+ this.tickRun = 0;
81
+ }
82
+ out += ch;
83
+ }
84
+ break;
85
+ }
86
+ case "fenceInfo": {
87
+ if (ch === "\n") {
88
+ const info = this.fenceBuf.slice(3);
89
+ if (/^json[ \t\r]*$/.test(info)) {
90
+ // ```json opener — start swallowing.
91
+ this.state = "json";
92
+ // Treat the opener's newline as a potential close-start so a
93
+ // degenerate "```json\n```" still terminates.
94
+ this.closeProgress = 1;
95
+ this.fenceBuf = "";
96
+ this.blocks++;
97
+ this.swallowedEver = true;
98
+ }
99
+ else {
100
+ // Plain / other-language fence — passes through unchanged.
101
+ out += this.fenceBuf + "\n";
102
+ this.fenceBuf = "";
103
+ this.state = "code";
104
+ this.closeProgress = 1;
105
+ }
106
+ }
107
+ else {
108
+ this.fenceBuf += ch;
109
+ if (this.fenceBuf.length > FENCE_INFO_MAX) {
110
+ // Too long to be a fence info-string — release and move on.
111
+ out += this.fenceBuf;
112
+ this.fenceBuf = "";
113
+ this.state = "code";
114
+ this.closeProgress = 0;
115
+ }
116
+ }
117
+ break;
118
+ }
119
+ case "json": {
120
+ // Swallow everything; watch for the "\n```" closing fence.
121
+ if (ch === "\n") {
122
+ this.closeProgress = 1;
123
+ }
124
+ else if (ch === "`" && this.closeProgress >= 1) {
125
+ this.closeProgress++;
126
+ if (this.closeProgress === 4) {
127
+ this.state = "afterJson";
128
+ this.closeProgress = 0;
129
+ }
130
+ }
131
+ else {
132
+ this.closeProgress = 0;
133
+ }
134
+ break;
135
+ }
136
+ case "afterJson": {
137
+ // Swallow the whitespace run right after a directive block so the
138
+ // removed block doesn't leave a blank gap in the display.
139
+ if (ch === "\n" || ch === "\r" || ch === " " || ch === "\t") {
140
+ break;
141
+ }
142
+ this.state = "text";
143
+ i--; // reprocess this char in text state
144
+ break;
145
+ }
146
+ case "code": {
147
+ // Inside a non-json fence: pass through, watch for "\n```" close.
148
+ out += ch;
149
+ if (ch === "\n") {
150
+ this.closeProgress = 1;
151
+ }
152
+ else if (ch === "`" && this.closeProgress >= 1) {
153
+ this.closeProgress++;
154
+ if (this.closeProgress === 4) {
155
+ this.state = "text";
156
+ this.closeProgress = 0;
157
+ }
158
+ }
159
+ else {
160
+ this.closeProgress = 0;
161
+ }
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ if (!this.visible && /\S/.test(out))
167
+ this.visible = true;
168
+ return out;
169
+ }
170
+ /** End of stream: release held-back non-directive text. */
171
+ flush() {
172
+ let out = "";
173
+ if (this.tickRun > 0) {
174
+ out += "`".repeat(this.tickRun);
175
+ this.tickRun = 0;
176
+ }
177
+ if (this.state === "fenceInfo") {
178
+ // Stream ended mid fence-opener that never proved to be json — show it.
179
+ out += this.fenceBuf;
180
+ this.fenceBuf = "";
181
+ this.state = "text";
182
+ }
183
+ // json / afterJson: an unterminated directive block stays swallowed —
184
+ // it's machine-directive junk either way.
185
+ if (!this.visible && /\S/.test(out))
186
+ this.visible = true;
187
+ return out;
188
+ }
189
+ /** Currently inside a ```json directive block (actively swallowing). */
190
+ get isSwallowing() {
191
+ return this.state === "json";
192
+ }
193
+ /** At least one ```json directive block was encountered. */
194
+ get hasSwallowedDirective() {
195
+ return this.swallowedEver;
196
+ }
197
+ /** Some non-whitespace text has been emitted for display. */
198
+ get hasVisibleOutput() {
199
+ return this.visible;
200
+ }
201
+ /** Number of ```json directive blocks encountered so far. */
202
+ get directiveBlockCount() {
203
+ return this.blocks;
204
+ }
205
+ }
206
+ exports.JsonDirectiveStreamFilter = JsonDirectiveStreamFilter;
207
+ /**
208
+ * Wrap stdout with the directive filter. Shows a subtle dim placeholder when
209
+ * a ```json block is being swallowed and the response would otherwise look
210
+ * empty mid-stream; clears it the moment real text arrives.
211
+ */
212
+ function createFilteredStdoutWriter(opts = {}) {
213
+ const out = opts.out ?? process.stdout;
214
+ const indent = opts.indent ?? " ";
215
+ const placeholder = opts.placeholder ?? exports.DIRECTIVE_SWALLOW_PLACEHOLDER;
216
+ const filter = new JsonDirectiveStreamFilter();
217
+ let placeholderShown = false;
218
+ let startedOutput = false;
219
+ const writeDisplayable = (text) => {
220
+ if (!text)
221
+ return;
222
+ if (!startedOutput) {
223
+ if (placeholderShown) {
224
+ // Replace the placeholder line with the real response.
225
+ out.write("\r\x1b[2K");
226
+ placeholderShown = false;
227
+ }
228
+ out.write(indent);
229
+ startedOutput = true;
230
+ }
231
+ out.write(text);
232
+ };
233
+ return {
234
+ write(token) {
235
+ writeDisplayable(filter.feed(token));
236
+ // A directive block is being (or was just) swallowed and nothing
237
+ // visible has been written — show the placeholder so the response
238
+ // doesn't look empty/stuck mid-stream.
239
+ if (!startedOutput && !placeholderShown && filter.hasSwallowedDirective) {
240
+ out.write(indent + chalk_1.default.dim(placeholder));
241
+ placeholderShown = true;
242
+ }
243
+ },
244
+ finish() {
245
+ writeDisplayable(filter.flush());
246
+ if (startedOutput || placeholderShown)
247
+ out.write("\n");
248
+ },
249
+ get wroteVisible() {
250
+ return startedOutput;
251
+ },
252
+ };
253
+ }
254
+ /**
255
+ * Stream a chat response token-by-token from a you.md SSE endpoint.
256
+ * Calls onToken with each RAW text delta (unfiltered — display filtering is
257
+ * the caller's concern) and returns the full assembled raw response.
258
+ */
259
+ async function streamSSEText(streamUrl, messages, onToken, timeoutMs = 120000) {
260
+ const res = await fetch(streamUrl, {
261
+ method: "POST",
262
+ headers: { "Content-Type": "application/json" },
263
+ body: JSON.stringify({ messages }),
264
+ signal: AbortSignal.timeout(timeoutMs),
265
+ });
266
+ if (!res.ok) {
267
+ const body = await res.text();
268
+ throw new Error(`Stream error (${res.status}): ${body}`);
269
+ }
270
+ if (!res.body) {
271
+ throw new Error("No response body from stream endpoint");
272
+ }
273
+ const reader = res.body.getReader();
274
+ const decoder = new TextDecoder();
275
+ let fullText = "";
276
+ let buffer = "";
277
+ const handleDataLine = (line) => {
278
+ const trimmed = line.trim();
279
+ if (!trimmed.startsWith("data: "))
280
+ return;
281
+ const data = trimmed.slice(6);
282
+ if (!data || data === "[DONE]")
283
+ return;
284
+ try {
285
+ const parsed = JSON.parse(data);
286
+ if (parsed.text) {
287
+ fullText += parsed.text;
288
+ onToken(parsed.text);
289
+ }
290
+ }
291
+ catch {
292
+ // Skip malformed SSE chunks
293
+ }
294
+ };
295
+ while (true) {
296
+ const { done, value } = await reader.read();
297
+ if (done)
298
+ break;
299
+ buffer += decoder.decode(value, { stream: true });
300
+ const lines = buffer.split("\n");
301
+ buffer = lines.pop() || "";
302
+ for (const line of lines)
303
+ handleDataLine(line);
304
+ }
305
+ if (buffer.trim())
306
+ handleDataLine(buffer);
307
+ return fullText;
308
+ }
309
+ /**
310
+ * Run one assistant turn: spinner while waiting for the first token, then
311
+ * live-stream the response with ```json directive blocks filtered out of the
312
+ * display. Returns the FULL RAW response text (directives intact) so the
313
+ * existing post-stream parsers keep working, plus whether it streamed.
314
+ *
315
+ * On stream failure (or an empty stream) falls back to the provided blocking
316
+ * call; in that case `streamed` is false and the caller is expected to render
317
+ * the parsed display text itself.
318
+ */
319
+ async function streamAssistantTurn(opts) {
320
+ const spinner = new render_1.BrailleSpinner(opts.spinnerLabel);
321
+ spinner.start();
322
+ const writer = createFilteredStdoutWriter({ placeholder: opts.placeholder });
323
+ let firstToken = true;
324
+ try {
325
+ const response = await streamSSEText(opts.streamUrl, opts.messages, (token) => {
326
+ if (firstToken) {
327
+ // Clear the spinner before writing streamed text.
328
+ spinner.stop();
329
+ firstToken = false;
330
+ }
331
+ writer.write(token);
332
+ }, opts.timeoutMs ?? 120000);
333
+ if (!firstToken) {
334
+ writer.finish();
335
+ return { text: response, streamed: true };
336
+ }
337
+ // No tokens arrived. Treat as a failure if we can fall back.
338
+ if (!opts.fallback) {
339
+ spinner.stop();
340
+ return { text: response, streamed: false };
341
+ }
342
+ throw new Error("empty stream response");
343
+ }
344
+ catch (err) {
345
+ if (!opts.fallback) {
346
+ if (firstToken)
347
+ spinner.stop();
348
+ throw err;
349
+ }
350
+ // Streaming failed — fall back to the blocking call.
351
+ spinner.update("streaming unavailable, waiting for response");
352
+ if (!firstToken) {
353
+ // Spinner was stopped when tokens started flowing; restart it for the
354
+ // fallback wait so the user isn't staring at a dead line.
355
+ spinner.start();
356
+ }
357
+ try {
358
+ const response = await opts.fallback();
359
+ spinner.stop();
360
+ return { text: response, streamed: false };
361
+ }
362
+ catch (fallbackErr) {
363
+ spinner.fail(fallbackErr instanceof Error ? fallbackErr.message : "failed");
364
+ throw fallbackErr;
365
+ }
366
+ }
367
+ }
368
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/lib/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ import { SkillDiscoveryCheck, SkillDiscoveryReport } from "./host-link";
2
+ import { type StackGuardResult, type SafetyCapabilityKey } from "./stackSafety";
3
+ export type YouStackVisibility = "private" | "scoped-link" | "public-open" | "team";
4
+ /**
5
+ * Canonical API scope vocabulary — mirrors convex/lib/scopes.ts API_SCOPES.
6
+ * P19 (2026-06-12): used by stack doctor to validate requiresScopes entries.
7
+ */
8
+ export declare const KNOWN_API_SCOPES: readonly ["read:public", "read:private", "write:bundle", "write:memories", "vault"];
9
+ export type ApiScope = (typeof KNOWN_API_SCOPES)[number];
10
+ export interface YouStackBrainScope {
11
+ scope: string;
12
+ required?: boolean;
13
+ reason?: string;
14
+ }
15
+ export interface YouStackFile {
16
+ path: string;
17
+ type: string;
18
+ required?: boolean;
19
+ checksum?: string;
20
+ }
21
+ export interface YouStackCapability {
22
+ id: string;
23
+ intent?: string;
24
+ workflow?: string;
25
+ skill?: string;
26
+ localOnly?: boolean;
27
+ mcpTool?: string;
28
+ apiEndpoint?: string;
29
+ requiredScopes?: string[];
30
+ mutationPolicy?: string;
31
+ }
32
+ export interface YouStackAdapter {
33
+ files?: string[];
34
+ bootstrap?: string;
35
+ }
36
+ export interface YouStackImprovementPolicy {
37
+ mode?: "observe" | "propose" | "auto_pr" | "auto_apply_local";
38
+ cadence?: string;
39
+ signals?: string[];
40
+ evals?: string[];
41
+ appliesTo?: string[];
42
+ approvalRequiredFor?: string[];
43
+ }
44
+ export type YouStackWorkflowActionType = "run_skill" | "report_skill_outcome";
45
+ export interface YouStackWorkflow {
46
+ id: string;
47
+ /** Standard 5-field cron expression. */
48
+ schedule: string;
49
+ action: YouStackWorkflowActionType;
50
+ /** Free-form params forwarded to the action handler. */
51
+ params?: Record<string, unknown>;
52
+ }
53
+ export interface YouStackUpdatePolicy {
54
+ channel?: string;
55
+ check?: string;
56
+ source?: string;
57
+ autoApply?: boolean;
58
+ pin?: string;
59
+ }
60
+ export interface YouStackManifest {
61
+ schemaVersion: "youstack/v1";
62
+ kind: "youstack";
63
+ id?: string;
64
+ slug: string;
65
+ name: string;
66
+ domain?: string;
67
+ aliases?: string[];
68
+ tags?: string[];
69
+ version: string;
70
+ description?: string;
71
+ owner?: Record<string, unknown>;
72
+ visibility: YouStackVisibility;
73
+ compatibility?: {
74
+ hosts?: string[];
75
+ minYoumdCli?: string;
76
+ requiresYoumdApi?: boolean;
77
+ requiresYoumdMcp?: boolean;
78
+ };
79
+ brainScopes?: YouStackBrainScope[];
80
+ /**
81
+ * P19 (2026-06-12): optional list of API scopes this stack requires.
82
+ * Doctor validates each entry against KNOWN_API_SCOPES and warns on unknowns.
83
+ */
84
+ requiresScopes?: ApiScope[];
85
+ files?: YouStackFile[];
86
+ adapters?: Record<string, YouStackAdapter>;
87
+ capabilities?: YouStackCapability[];
88
+ accessPolicy?: Record<string, unknown>;
89
+ sharing?: Record<string, unknown>;
90
+ repoSync?: Record<string, unknown>;
91
+ docs?: Record<string, unknown>;
92
+ tests?: Record<string, unknown>;
93
+ improvement?: YouStackImprovementPolicy;
94
+ update?: YouStackUpdatePolicy;
95
+ /** L18: optional scheduled workflow declarations. */
96
+ workflows?: YouStackWorkflow[];
97
+ provenance?: Record<string, unknown>;
98
+ /** Machine-checkable safety contract (L16). */
99
+ safety?: {
100
+ tier: "T0" | "T1" | "T2" | "T3";
101
+ capabilities: {
102
+ fs_write?: boolean;
103
+ network?: boolean;
104
+ shell?: boolean;
105
+ auto_pr?: boolean;
106
+ };
107
+ humanGate: {
108
+ required: boolean;
109
+ scopes?: string[];
110
+ };
111
+ };
112
+ }
113
+ export interface LoadedYouStack {
114
+ manifest: YouStackManifest;
115
+ manifestPath: string;
116
+ rootDir: string;
117
+ validation: YouStackValidationResult;
118
+ }
119
+ export interface YouStackValidationResult {
120
+ ok: boolean;
121
+ errors: string[];
122
+ warnings: string[];
123
+ }
124
+ export interface YouStackSmokeResult extends YouStackValidationResult {
125
+ checks: string[];
126
+ }
127
+ export interface YouStackDoctorResult extends YouStackSmokeResult {
128
+ diagnostics: string[];
129
+ recommendations: string[];
130
+ /**
131
+ * Empirical Claude Code discovery gate: per-skill pass/fail for the
132
+ * SKILL.md files this stack would emit for the claude-code host.
133
+ */
134
+ discovery: SkillDiscoveryCheck[];
135
+ /**
136
+ * L12 safety guard result — present when the manifest has a `safety`
137
+ * section or when the guard detected inferred capability mismatches.
138
+ * Missing contract is treated as T0 with a warning.
139
+ */
140
+ guard?: StackGuardResult;
141
+ }
142
+ export type YouStackReadinessStatus = "not_found" | "invalid" | "ready";
143
+ export interface YouStackReadiness {
144
+ status: YouStackReadinessStatus;
145
+ ready: boolean;
146
+ reason: string;
147
+ }
148
+ export interface YouStackRouteResult {
149
+ request: string;
150
+ capability: YouStackCapability;
151
+ score: number;
152
+ reasons: string[];
153
+ alternatives: Array<{
154
+ capability: YouStackCapability;
155
+ score: number;
156
+ }>;
157
+ }
158
+ export interface YouStackLinkResult {
159
+ host: string;
160
+ targetPath: string;
161
+ wrote: boolean;
162
+ content: string;
163
+ }
164
+ export declare function isCanonicalYouStackManifestPath(manifestPath: string): boolean;
165
+ export declare function findYouStackManifestCandidates(startDir: string): string[];
166
+ export declare function resolveYouStackManifestPath(inputPath?: string): string;
167
+ export declare function validateYouStackManifest(value: unknown): YouStackValidationResult;
168
+ export declare function loadYouStackManifest(inputPath?: string): LoadedYouStack;
169
+ export declare function getYouStackReadiness(loaded: LoadedYouStack | null): YouStackReadiness;
170
+ export declare function sha256File(filePath: string): string;
171
+ export declare function getYouStackCapabilities(manifest: YouStackManifest): YouStackCapability[];
172
+ export declare function runYouStackSmoke(loaded: LoadedYouStack): YouStackSmokeResult;
173
+ export declare function runYouStackDoctor(loaded: LoadedYouStack): YouStackDoctorResult;
174
+ export declare function routeYouStackRequest(manifest: YouStackManifest, request: string): YouStackRouteResult;
175
+ /**
176
+ * Runtime enforcement hook (L12).
177
+ *
178
+ * Maps a mutation policy to a capability key, then checks the safety contract.
179
+ * Returns a refusal message if the requested action exceeds the declared tier,
180
+ * or null if the action is allowed.
181
+ *
182
+ * Usage: call this before any write action in stack routing flows.
183
+ *
184
+ * Example refusal: "blocked: stack is T1 (suggest-only) — this action needs T2"
185
+ */
186
+ export declare function checkTierAllows(manifest: YouStackManifest, capabilityKey: SafetyCapabilityKey): string | null;
187
+ export declare function normalizeYouStackHost(host: string): string;
188
+ /** Default link path for one host — derived from the engine adapter config. */
189
+ export declare function defaultAdapterPath(host: string, slug: string): string;
190
+ /**
191
+ * Render the stack adapter content for a host. Frontmatter shape is decided
192
+ * by the engine's per-host adapter config, not by host conditionals here.
193
+ */
194
+ export declare function generateYouStackAdapterContent(manifest: YouStackManifest, host: string): string;
195
+ /**
196
+ * Build the per-host link plans (paths + rendered content) for a stack
197
+ * without touching the filesystem. All hosts go through the one engine;
198
+ * manifest-declared adapter paths still override the default layout.
199
+ */
200
+ export declare function planYouStackAdapterLinks(loaded: LoadedYouStack, hosts?: string[]): Array<{
201
+ host: string;
202
+ relativePath: string;
203
+ content: string;
204
+ }>;
205
+ export declare function linkYouStackAdapters(loaded: LoadedYouStack, options?: {
206
+ hosts?: string[];
207
+ targetDir?: string;
208
+ dryRun?: boolean;
209
+ }): YouStackLinkResult[];
210
+ /**
211
+ * Empirical Claude Code discovery release gate (exported for CI use):
212
+ * verify that every SKILL.md this stack would emit for the claude-code
213
+ * host parses, carries name + description, name matches its directory,
214
+ * and has a non-empty body.
215
+ */
216
+ export declare function verifyYouStackClaudeDiscovery(loaded: LoadedYouStack): SkillDiscoveryReport;
217
+ export { runStackGuard, parseSafetyContract, tierAllows, tierRefusalMessage } from "./stackSafety";
218
+ export type { StackGuardResult, StackSafetyContract, SafetyTier, SafetyCapabilityKey, ContractValidationResult, ContractViolation, GuardCheckResult, } from "./stackSafety";
219
+ //# sourceMappingURL=youstack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youstack.d.ts","sourceRoot":"","sources":["../../src/lib/youstack.ts"],"names":[],"mappings":"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"}