brass-runtime 1.15.0 → 1.16.1

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 (209) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +673 -136
  3. package/dist/agent/cli/main.cjs +40 -35
  4. package/dist/agent/cli/main.js +9 -4
  5. package/dist/agent/cli/main.mjs +9 -4
  6. package/dist/agent/index.cjs +8 -4
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +7 -3
  9. package/dist/agent/index.mjs +7 -3
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/chunk-3AYM6WPJ.js +1629 -0
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3RG5ZIWI.js +10 -0
  15. package/dist/chunk-3Y2RIUMM.js +300 -0
  16. package/dist/{chunk-VEZNF5GZ.cjs → chunk-4ROBZFL6.cjs} +130 -126
  17. package/dist/{chunk-3QMOKAS5.js → chunk-52OB2ROS.js} +9 -5
  18. package/dist/chunk-52PPNNI4.cjs +416 -0
  19. package/dist/chunk-5EC274J5.cjs +2874 -0
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/chunk-5VRJNBLZ.mjs +2874 -0
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-74ZTY6CP.js +2871 -0
  25. package/dist/chunk-76YMRMH2.cjs +777 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-4NHES7VK.mjs → chunk-7JIJOVCT.js} +27 -13
  28. package/dist/chunk-A2OM6NEH.mjs +194 -0
  29. package/dist/chunk-AGR5B2BC.cjs +683 -0
  30. package/dist/chunk-AVNQLJ5V.js +777 -0
  31. package/dist/chunk-B33ICAKP.js +313 -0
  32. package/dist/{chunk-ELOOF35R.mjs → chunk-B5JD23U7.mjs} +1 -1
  33. package/dist/chunk-BABBZK4Y.js +2024 -0
  34. package/dist/chunk-C3MDXTRZ.js +354 -0
  35. package/dist/chunk-CIZFIMK5.js +2193 -0
  36. package/dist/chunk-CZIVE6NT.cjs +354 -0
  37. package/dist/chunk-DNFJLJMW.mjs +354 -0
  38. package/dist/chunk-DNFO2EIZ.mjs +777 -0
  39. package/dist/chunk-EJ6BPYVR.mjs +416 -0
  40. package/dist/chunk-ENKODRU3.cjs +2193 -0
  41. package/dist/chunk-EOC4UHBS.mjs +229 -0
  42. package/dist/{chunk-BMH5AV44.js → chunk-FH2X7BVP.js} +756 -440
  43. package/dist/{chunk-PPUXIH5R.js → chunk-FHQGHPMO.mjs} +27 -13
  44. package/dist/{chunk-TGIFUAK4.cjs → chunk-GLE2WY7Z.cjs} +951 -635
  45. package/dist/{chunk-BDF4AMWX.mjs → chunk-GYM3LLGS.mjs} +756 -440
  46. package/dist/chunk-HLWLMW2F.mjs +2024 -0
  47. package/dist/chunk-JF5WGYJJ.cjs +194 -0
  48. package/dist/chunk-KH4SYAOS.mjs +1629 -0
  49. package/dist/chunk-KN32XNTH.mjs +313 -0
  50. package/dist/chunk-KQLYONSE.cjs +2871 -0
  51. package/dist/{chunk-STVLQ3XD.cjs → chunk-KZJQ723N.cjs} +92 -78
  52. package/dist/chunk-L2SYFEBS.js +194 -0
  53. package/dist/chunk-L6VB5N7Q.cjs +104 -0
  54. package/dist/{chunk-K6M7MDZ4.mjs → chunk-MBEJI5HF.mjs} +9 -5
  55. package/dist/chunk-MIIYDLGM.js +2874 -0
  56. package/dist/chunk-MOO4L7F4.mjs +104 -0
  57. package/dist/chunk-MT3OWDPC.mjs +2193 -0
  58. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  59. package/dist/chunk-OBGZSXTJ.cjs +10 -0
  60. package/dist/chunk-PD4EJTQC.cjs +229 -0
  61. package/dist/chunk-PWC3RBQE.mjs +300 -0
  62. package/dist/chunk-Q2I37RP3.cjs +1629 -0
  63. package/dist/chunk-RKGKFN2A.js +416 -0
  64. package/dist/{chunk-R3R2FVLG.cjs → chunk-SA6HUJVI.cjs} +5 -5
  65. package/dist/chunk-TRM4JUZQ.js +104 -0
  66. package/dist/chunk-UB4B6OFY.js +370 -0
  67. package/dist/{chunk-TO7IKXYT.js → chunk-UCUBNWM2.js} +1 -1
  68. package/dist/chunk-VN44DYYT.cjs +2024 -0
  69. package/dist/chunk-Y6FXYEAI.mjs +10 -0
  70. package/dist/client-CZHU674n.d.ts +820 -0
  71. package/dist/core/index.cjs +198 -4
  72. package/dist/core/index.d.ts +311 -212
  73. package/dist/core/index.js +237 -43
  74. package/dist/core/index.mjs +237 -43
  75. package/dist/{effect-CMOQKX8y.d.ts → effect-DIUHZ9IN.d.ts} +195 -1
  76. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  77. package/dist/effectRunner-L4S7IPT3.js +8 -0
  78. package/dist/effectRunner-NNGG75QA.mjs +8 -0
  79. package/dist/http/index.cjs +1227 -2971
  80. package/dist/http/index.d.ts +826 -280
  81. package/dist/http/index.js +1089 -2833
  82. package/dist/http/index.mjs +1089 -2833
  83. package/dist/http/testing.cjs +161 -0
  84. package/dist/http/testing.d.ts +43 -0
  85. package/dist/http/testing.js +161 -0
  86. package/dist/http/testing.mjs +161 -0
  87. package/dist/index.cjs +486 -250
  88. package/dist/index.d.ts +87 -95
  89. package/dist/index.js +391 -155
  90. package/dist/index.mjs +391 -155
  91. package/dist/observability/index.cjs +162 -0
  92. package/dist/observability/index.d.ts +152 -0
  93. package/dist/observability/index.js +162 -0
  94. package/dist/observability/index.mjs +162 -0
  95. package/dist/perf/cli.cjs +401 -0
  96. package/dist/perf/cli.d.ts +1 -0
  97. package/dist/perf/cli.js +401 -0
  98. package/dist/perf/cli.mjs +401 -0
  99. package/dist/perf/index.cjs +141 -0
  100. package/dist/perf/index.d.ts +483 -0
  101. package/dist/perf/index.js +141 -0
  102. package/dist/perf/index.mjs +141 -0
  103. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  104. package/dist/schema/index.cjs +29 -0
  105. package/dist/schema/index.d.ts +179 -0
  106. package/dist/schema/index.js +29 -0
  107. package/dist/schema/index.mjs +29 -0
  108. package/dist/server-GJPg8ZSG.d.ts +675 -0
  109. package/dist/{stream-FQm9h4Mg.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  110. package/dist/tracer-Hwt1cl7h.d.ts +189 -0
  111. package/dist/tracing-DqbTKGcf.d.ts +148 -0
  112. package/docs/ARCHITECTURE.md +292 -0
  113. package/docs/README.md +63 -0
  114. package/docs/adr/0001-ai-context-pack.md +32 -0
  115. package/docs/agent-apply-mode.md +104 -0
  116. package/docs/agent-approvals.md +110 -0
  117. package/docs/agent-batch.md +185 -0
  118. package/docs/agent-boundaries.md +112 -0
  119. package/docs/agent-chat-sessions.md +160 -0
  120. package/docs/agent-ci.md +17 -0
  121. package/docs/agent-cli.md +405 -0
  122. package/docs/agent-config.md +480 -0
  123. package/docs/agent-context-discovery.md +159 -0
  124. package/docs/agent-copilot-like-dx.md +126 -0
  125. package/docs/agent-declarative-optimized-planning.md +138 -0
  126. package/docs/agent-dx.md +224 -0
  127. package/docs/agent-env-files.md +126 -0
  128. package/docs/agent-follow-up-context.md +43 -0
  129. package/docs/agent-global-usage.md +180 -0
  130. package/docs/agent-init.md +109 -0
  131. package/docs/agent-install-and-configure.md +516 -0
  132. package/docs/agent-language-workspace-ux.md +99 -0
  133. package/docs/agent-llm-adapters.md +123 -0
  134. package/docs/agent-local-install.md +190 -0
  135. package/docs/agent-local-tests.md +51 -0
  136. package/docs/agent-observability.md +155 -0
  137. package/docs/agent-patch-quality-loop.md +162 -0
  138. package/docs/agent-presets.md +22 -0
  139. package/docs/agent-project-commands.md +237 -0
  140. package/docs/agent-project-intelligence.md +156 -0
  141. package/docs/agent-redaction.md +18 -0
  142. package/docs/agent-release-readiness.md +76 -0
  143. package/docs/agent-rollback-safety.md +162 -0
  144. package/docs/agent-rollback.md +23 -0
  145. package/docs/agent-run-artifacts.md +16 -0
  146. package/docs/agent-vscode-auto-discovery.md +137 -0
  147. package/docs/agent-vscode-batch-runner.md +100 -0
  148. package/docs/agent-vscode-chat-layout.md +90 -0
  149. package/docs/agent-vscode-clean-install.md +147 -0
  150. package/docs/agent-vscode-code-actions.md +70 -0
  151. package/docs/agent-vscode-diff-preview.md +45 -0
  152. package/docs/agent-vscode-inline-assist.md +56 -0
  153. package/docs/agent-vscode-install.md +186 -0
  154. package/docs/agent-vscode-model-setup.md +97 -0
  155. package/docs/agent-vscode-patch-preview.md +92 -0
  156. package/docs/agent-vscode-problems.md +79 -0
  157. package/docs/agent-vscode-project-dashboard.md +106 -0
  158. package/docs/agent-vscode-run-history.md +92 -0
  159. package/docs/agent-vscode-ux.md +73 -0
  160. package/docs/ai/INVARIANTS.md +84 -0
  161. package/docs/ai/PROJECT_MAP.md +338 -0
  162. package/docs/ai/PUBLIC_API.md +336 -0
  163. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  164. package/docs/api-polish.md +37 -0
  165. package/docs/cancellation.md +162 -0
  166. package/docs/coverage.md +46 -0
  167. package/docs/getting-started.md +159 -0
  168. package/docs/guides/README.md +40 -0
  169. package/docs/guides/circuit-breaker.md +89 -0
  170. package/docs/guides/error-handling.md +91 -0
  171. package/docs/guides/getting-started.md +107 -0
  172. package/docs/guides/layers.md +189 -0
  173. package/docs/guides/metrics.md +101 -0
  174. package/docs/guides/resource-management.md +141 -0
  175. package/docs/guides/retry.md +215 -0
  176. package/docs/guides/semaphore.md +66 -0
  177. package/docs/guides/streams.md +117 -0
  178. package/docs/guides/supervisors.md +98 -0
  179. package/docs/guides/testing.md +162 -0
  180. package/docs/guides/tracing.md +71 -0
  181. package/docs/http-recipes.md +399 -0
  182. package/docs/http.md +749 -0
  183. package/docs/modules.md +285 -0
  184. package/docs/observability-collector-smoke.md +31 -0
  185. package/docs/observability-framework-examples.md +98 -0
  186. package/docs/observability.md +542 -0
  187. package/docs/otel-collector-smoke.yaml +27 -0
  188. package/docs/performance-profiler.md +199 -0
  189. package/docs/production-readiness.md +73 -0
  190. package/docs/recipes/README.md +12 -0
  191. package/docs/recipes/http-server.md +45 -0
  192. package/docs/recipes/layers.md +44 -0
  193. package/docs/recipes/performance.md +47 -0
  194. package/docs/recipes/runtime.md +41 -0
  195. package/docs/recipes/testing.md +41 -0
  196. package/docs/release.md +53 -0
  197. package/docs/wasm-bounded-queues.md +44 -0
  198. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  199. package/docs/wasm-fiber-engine.md +117 -0
  200. package/docs/wasm-scheduler-state-machine.md +122 -0
  201. package/docs/wasm-stream-chunks.md +54 -0
  202. package/package.json +48 -2
  203. package/dist/chunk-AR22SXML.js +0 -1043
  204. package/dist/chunk-BDYEENHT.js +0 -224
  205. package/dist/chunk-JFPU5GQI.mjs +0 -1043
  206. package/dist/chunk-MS34J5LY.cjs +0 -224
  207. package/dist/chunk-UMAZLXAB.mjs +0 -224
  208. package/dist/chunk-XPZNXSVN.cjs +0 -1043
  209. package/dist/tracing-DNT9jEbr.d.ts +0 -106
@@ -0,0 +1,229 @@
1
+ import {
2
+ makeRuntimeEventRecord
3
+ } from "./chunk-RKGKFN2A.js";
4
+ import {
5
+ emptyContext,
6
+ getCurrentFiber
7
+ } from "./chunk-FH2X7BVP.js";
8
+ import {
9
+ Cause,
10
+ asyncFlatMap,
11
+ asyncSync
12
+ } from "./chunk-UB4B6OFY.js";
13
+
14
+ // src/core/runtime/fiberRef.ts
15
+ var nextFiberRefId = 1;
16
+ function makeFiberRef(initial) {
17
+ const ref = {
18
+ id: nextFiberRefId++,
19
+ initial,
20
+ get: () => getFiberRef(ref),
21
+ set: (value) => setFiberRef(ref, value),
22
+ update: (f) => updateFiberRef(ref, f),
23
+ modify: (f) => modifyFiberRef(ref, f),
24
+ locally: (value, effect) => locallyFiberRef(ref, value, effect),
25
+ locallyWith: (f, effect) => locallyFiberRefWith(ref, f, effect),
26
+ unsafeGet: () => unsafeGetFiberRef(ref),
27
+ unsafeSet: (value) => unsafeSetFiberRef(ref, value)
28
+ };
29
+ return ref;
30
+ }
31
+ function getFiberRef(ref) {
32
+ return asyncSync(() => unsafeGetFiberRef(ref));
33
+ }
34
+ function setFiberRef(ref, value) {
35
+ return asyncSync(() => {
36
+ unsafeSetFiberRef(ref, value);
37
+ });
38
+ }
39
+ function updateFiberRef(ref, f) {
40
+ return asyncSync(() => {
41
+ const next = f(unsafeGetFiberRef(ref));
42
+ unsafeSetFiberRef(ref, next);
43
+ return next;
44
+ });
45
+ }
46
+ function modifyFiberRef(ref, f) {
47
+ return asyncSync(() => {
48
+ const [result, next] = f(unsafeGetFiberRef(ref));
49
+ unsafeSetFiberRef(ref, next);
50
+ return result;
51
+ });
52
+ }
53
+ function locallyFiberRef(ref, value, effect) {
54
+ return {
55
+ _tag: "FiberRefLocally",
56
+ refId: ref.id,
57
+ value,
58
+ effect
59
+ };
60
+ }
61
+ function locallyFiberRefWith(ref, f, effect) {
62
+ return asyncFlatMap(getFiberRef(ref), (value) => locallyFiberRef(ref, f(value), effect));
63
+ }
64
+ function unsafeGetFiberRef(ref) {
65
+ const refs = currentFiberRefs(false);
66
+ return refs?.has(ref.id) ? refs.get(ref.id) : ref.initial;
67
+ }
68
+ function unsafeSetFiberRef(ref, value) {
69
+ const refs = currentFiberRefs(true);
70
+ refs?.set(ref.id, value);
71
+ }
72
+ function fiberRefSnapshot() {
73
+ return new Map(currentFiberRefs(false));
74
+ }
75
+ function currentFiberRefs(create) {
76
+ const fiber = getCurrentFiber();
77
+ if (!fiber) return void 0;
78
+ fiber.fiberContext ??= { log: emptyContext, trace: null };
79
+ if (!fiber.fiberContext.fiberRefs && create) fiber.fiberContext.fiberRefs = /* @__PURE__ */ new Map();
80
+ return fiber.fiberContext.fiberRefs;
81
+ }
82
+
83
+ // src/core/runtime/recorder.ts
84
+ function makeRuntimeRecorder(options = {}) {
85
+ const capacity = Math.max(1, Math.floor(options.maxEvents ?? 2048));
86
+ const records = new Array(capacity);
87
+ let next = 0;
88
+ let size = 0;
89
+ let dropped = 0;
90
+ let seq = 1;
91
+ const snapshot = () => {
92
+ const out = [];
93
+ const start = size === capacity ? next : 0;
94
+ for (let i = 0; i < size; i++) {
95
+ const record = records[(start + i) % capacity];
96
+ if (record) out.push(record);
97
+ }
98
+ return out;
99
+ };
100
+ const emit = (ev, ctx) => {
101
+ records[next] = makeRuntimeEventRecord(ev, ctx, seq++);
102
+ next = (next + 1) % capacity;
103
+ if (size < capacity) size++;
104
+ else dropped++;
105
+ };
106
+ const clear = () => {
107
+ records.fill(void 0);
108
+ next = 0;
109
+ size = 0;
110
+ dropped = 0;
111
+ };
112
+ const stats = () => {
113
+ const current = snapshot();
114
+ return {
115
+ size,
116
+ capacity,
117
+ dropped,
118
+ ...current[0] ? { firstSeq: current[0].seq } : {},
119
+ ...current[current.length - 1] ? { lastSeq: current[current.length - 1].seq } : {}
120
+ };
121
+ };
122
+ const recorder = {
123
+ emit,
124
+ snapshot,
125
+ clear,
126
+ stats,
127
+ explain: (explainOptions = {}) => explainRuntimeEvents(snapshot(), dropped, explainOptions)
128
+ };
129
+ return Object.assign(recorder, { hooks: recorder });
130
+ }
131
+ function explainRuntimeEvents(events, dropped, options) {
132
+ const maxEvents = Math.max(1, Math.floor(options.maxEvents ?? 80));
133
+ const slice = events.length > maxEvents ? events.slice(events.length - maxEvents) : events;
134
+ const fiberStarts = /* @__PURE__ */ new Map();
135
+ const fiberSuspends = /* @__PURE__ */ new Map();
136
+ const lines = [`Runtime flight recorder: ${events.length} event${events.length === 1 ? "" : "s"}${dropped > 0 ? `, ${dropped} dropped` : ""}.`];
137
+ for (const event of slice) {
138
+ switch (event.type) {
139
+ case "fiber.start": {
140
+ fiberStarts.set(event.fiberId, event);
141
+ lines.push(`fiber#${event.fiberId} started${event.name ? ` "${event.name}"` : ""}${event.parentFiberId !== void 0 ? ` parent=fiber#${event.parentFiberId}` : ""}`);
142
+ break;
143
+ }
144
+ case "fiber.suspend": {
145
+ fiberSuspends.set(event.fiberId, event);
146
+ lines.push(`fiber#${event.fiberId} suspended awaiting ${event.reason ?? "unknown"}`);
147
+ break;
148
+ }
149
+ case "fiber.resume": {
150
+ const suspended = fiberSuspends.get(event.fiberId);
151
+ fiberSuspends.delete(event.fiberId);
152
+ lines.push(`fiber#${event.fiberId} resumed${suspended ? ` after ${durationMs(suspended, event)} awaiting ${fiberSuspendReason(suspended)}` : ""}`);
153
+ break;
154
+ }
155
+ case "fiber.end": {
156
+ const started = fiberStarts.get(event.fiberId);
157
+ const suspended = fiberSuspends.get(event.fiberId);
158
+ fiberSuspends.delete(event.fiberId);
159
+ lines.push(`fiber#${event.fiberId} ended ${event.status}${started ? ` after ${durationMs(started, event)}` : ""}${suspended ? ` while awaiting ${fiberSuspendReason(suspended)}` : ""}${event.error ? ` error=${formatUnknown(event.error)}` : ""}`);
160
+ break;
161
+ }
162
+ case "scope.open":
163
+ lines.push(`scope#${event.scopeId} opened${event.parentScopeId !== void 0 ? ` parent=scope#${event.parentScopeId}` : ""}`);
164
+ break;
165
+ case "scope.close":
166
+ lines.push(`scope#${event.scopeId} closed ${event.status}${event.error ? ` error=${formatUnknown(event.error)}` : ""}`);
167
+ break;
168
+ case "supervisor.child.restart":
169
+ lines.push(`supervisor#${event.supervisorId} restarting child#${event.childId} attempt=${event.restartCount} delay=${event.delayMs}ms${event.reason ? ` reason=${event.reason}` : ""}`);
170
+ break;
171
+ case "supervisor.child.escalate":
172
+ lines.push(`supervisor#${event.supervisorId} escalated child#${event.childId}${event.reason ? ` reason=${event.reason}` : ""}${event.error ? ` error=${formatUnknown(event.error)}` : ""}`);
173
+ break;
174
+ case "schedule.decision":
175
+ lines.push(`schedule${event.name ? ` "${event.name}"` : ""} attempt=${event.attempt} ${event.continue ? "continues" : "stops"} delay=${event.delayMs}ms elapsed=${Math.round(event.elapsedMs)}ms${event.reason ? ` reason=${event.reason}` : ""}`);
176
+ break;
177
+ case "log":
178
+ if (event.level === "warn" || event.level === "error") {
179
+ lines.push(`${event.level}: ${event.message ?? ""}${event.fields ? ` ${JSON.stringify(event.fields)}` : ""}`);
180
+ }
181
+ break;
182
+ case "span.start":
183
+ lines.push(`span started "${event.name}"${event.traceId ? ` trace=${event.traceId}` : ""}`);
184
+ break;
185
+ case "span.end":
186
+ lines.push(`span ended ${event.status}${event.name ? ` "${event.name}"` : ""}${event.error ? ` error=${formatUnknown(event.error)}` : ""}`);
187
+ break;
188
+ default:
189
+ break;
190
+ }
191
+ }
192
+ for (const suspended of fiberSuspends.values()) {
193
+ lines.push(`fiber#${suspended.fiberId} still suspended for ${durationFromNowMs(suspended)} awaiting ${fiberSuspendReason(suspended)}`);
194
+ }
195
+ return lines.join("\n");
196
+ }
197
+ function durationMs(start, end) {
198
+ return `${Math.max(0, Math.round(end.wallTs - start.wallTs))}ms`;
199
+ }
200
+ function durationFromNowMs(start) {
201
+ return `${Math.max(0, Math.round(Date.now() - start.wallTs))}ms`;
202
+ }
203
+ function formatUnknown(value) {
204
+ if (Cause.isCause(value)) return Cause.pretty(value, { singleLine: true });
205
+ if (value instanceof Error) return value.message;
206
+ if (typeof value === "string") return value;
207
+ try {
208
+ return JSON.stringify(value);
209
+ } catch {
210
+ return String(value);
211
+ }
212
+ }
213
+ function fiberSuspendReason(record) {
214
+ return record.type === "fiber.suspend" ? record.reason ?? "unknown" : "unknown";
215
+ }
216
+
217
+ export {
218
+ makeFiberRef,
219
+ getFiberRef,
220
+ setFiberRef,
221
+ updateFiberRef,
222
+ modifyFiberRef,
223
+ locallyFiberRef,
224
+ locallyFiberRefWith,
225
+ unsafeGetFiberRef,
226
+ unsafeSetFiberRef,
227
+ fiberRefSnapshot,
228
+ makeRuntimeRecorder
229
+ };