@brainst0rm/core 0.13.0 → 0.14.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 (51) hide show
  1. package/dist/chunk-M7BBX56R.js +340 -0
  2. package/dist/chunk-M7BBX56R.js.map +1 -0
  3. package/dist/{chunk-SWXTFHC7.js → chunk-Z5D2QZY6.js} +3 -3
  4. package/dist/chunk-Z5D2QZY6.js.map +1 -0
  5. package/dist/chunk-Z6ZWNWWR.js +34 -0
  6. package/dist/index.d.ts +2717 -188
  7. package/dist/index.js +16178 -7949
  8. package/dist/index.js.map +1 -1
  9. package/dist/self-extend-47LWSK3E.js +52 -0
  10. package/dist/self-extend-47LWSK3E.js.map +1 -0
  11. package/dist/skills/builtin/api-and-interface-design/SKILL.md +300 -0
  12. package/dist/skills/builtin/browser-testing-with-devtools/SKILL.md +307 -0
  13. package/dist/skills/builtin/ci-cd-and-automation/SKILL.md +391 -0
  14. package/dist/skills/builtin/code-review-and-quality/SKILL.md +353 -0
  15. package/dist/skills/builtin/code-simplification/SKILL.md +340 -0
  16. package/dist/skills/builtin/context-engineering/SKILL.md +301 -0
  17. package/dist/skills/builtin/daemon-operations/SKILL.md +55 -0
  18. package/dist/skills/builtin/debugging-and-error-recovery/SKILL.md +306 -0
  19. package/dist/skills/builtin/deprecation-and-migration/SKILL.md +207 -0
  20. package/dist/skills/builtin/documentation-and-adrs/SKILL.md +295 -0
  21. package/dist/skills/builtin/frontend-ui-engineering/SKILL.md +333 -0
  22. package/dist/skills/builtin/git-workflow-and-versioning/SKILL.md +303 -0
  23. package/dist/skills/builtin/github-collaboration/SKILL.md +215 -0
  24. package/dist/skills/builtin/godmode-operations/SKILL.md +68 -0
  25. package/dist/skills/builtin/idea-refine/SKILL.md +186 -0
  26. package/dist/skills/builtin/idea-refine/examples.md +244 -0
  27. package/dist/skills/builtin/idea-refine/frameworks.md +101 -0
  28. package/dist/skills/builtin/idea-refine/refinement-criteria.md +126 -0
  29. package/dist/skills/builtin/idea-refine/scripts/idea-refine.sh +15 -0
  30. package/dist/skills/builtin/incremental-implementation/SKILL.md +243 -0
  31. package/dist/skills/builtin/memory-init/SKILL.md +54 -0
  32. package/dist/skills/builtin/memory-reflection/SKILL.md +59 -0
  33. package/dist/skills/builtin/multi-model-routing/SKILL.md +56 -0
  34. package/dist/skills/builtin/performance-optimization/SKILL.md +291 -0
  35. package/dist/skills/builtin/planning-and-task-breakdown/SKILL.md +240 -0
  36. package/dist/skills/builtin/security-and-hardening/SKILL.md +368 -0
  37. package/dist/skills/builtin/shipping-and-launch/SKILL.md +310 -0
  38. package/dist/skills/builtin/spec-driven-development/SKILL.md +212 -0
  39. package/dist/skills/builtin/test-driven-development/SKILL.md +376 -0
  40. package/dist/skills/builtin/using-agent-skills/SKILL.md +173 -0
  41. package/dist/trajectory-analyzer-ZAI2XUAI.js +14 -0
  42. package/dist/{trajectory-capture-RF7TUN6I.js → trajectory-capture-ERPIVYQJ.js} +3 -3
  43. package/package.json +14 -11
  44. package/dist/chunk-OU3NPQBH.js +0 -87
  45. package/dist/chunk-OU3NPQBH.js.map +0 -1
  46. package/dist/chunk-PZ5AY32C.js +0 -10
  47. package/dist/chunk-SWXTFHC7.js.map +0 -1
  48. package/dist/trajectory-MOCIJBV6.js +0 -8
  49. /package/dist/{chunk-PZ5AY32C.js.map → chunk-Z6ZWNWWR.js.map} +0 -0
  50. /package/dist/{trajectory-MOCIJBV6.js.map → trajectory-analyzer-ZAI2XUAI.js.map} +0 -0
  51. /package/dist/{trajectory-capture-RF7TUN6I.js.map → trajectory-capture-ERPIVYQJ.js.map} +0 -0
@@ -0,0 +1,173 @@
1
+ ---
2
+ name: using-agent-skills
3
+ description: Discovers and invokes agent skills. Use when starting a session or when you need to discover which skill applies to the current task. This is the meta-skill that governs how all other skills are discovered and invoked.
4
+ ---
5
+
6
+ # Using Agent Skills
7
+
8
+ ## Overview
9
+
10
+ Agent Skills is a collection of engineering workflow skills organized by development phase. Each skill encodes a specific process that senior engineers follow. This meta-skill helps you discover and apply the right skill for your current task.
11
+
12
+ ## Skill Discovery
13
+
14
+ When a task arrives, identify the development phase and apply the corresponding skill:
15
+
16
+ ```
17
+ Task arrives
18
+
19
+ ├── Vague idea/need refinement? ──→ idea-refine
20
+ ├── New project/feature/change? ──→ spec-driven-development
21
+ ├── Have a spec, need tasks? ──────→ planning-and-task-breakdown
22
+ ├── Implementing code? ────────────→ incremental-implementation
23
+ │ ├── UI work? ─────────────────→ frontend-ui-engineering
24
+ │ ├── API work? ────────────────→ api-and-interface-design
25
+ │ └── Need better context? ─────→ context-engineering
26
+ ├── Writing/running tests? ────────→ test-driven-development
27
+ │ └── Browser-based? ───────────→ browser-testing-with-devtools
28
+ ├── Something broke? ──────────────→ debugging-and-error-recovery
29
+ ├── Reviewing code? ───────────────→ code-review-and-quality
30
+ │ ├── Security concerns? ───────→ security-and-hardening
31
+ │ └── Performance concerns? ────→ performance-optimization
32
+ ├── Committing/branching? ─────────→ git-workflow-and-versioning
33
+ ├── CI/CD pipeline work? ──────────→ ci-cd-and-automation
34
+ ├── Writing docs/ADRs? ───────────→ documentation-and-adrs
35
+ └── Deploying/launching? ─────────→ shipping-and-launch
36
+ ```
37
+
38
+ ## Core Operating Behaviors
39
+
40
+ These behaviors apply at all times, across all skills. They are non-negotiable.
41
+
42
+ ### 1. Surface Assumptions
43
+
44
+ Before implementing anything non-trivial, explicitly state your assumptions:
45
+
46
+ ```
47
+ ASSUMPTIONS I'M MAKING:
48
+ 1. [assumption about requirements]
49
+ 2. [assumption about architecture]
50
+ 3. [assumption about scope]
51
+ → Correct me now or I'll proceed with these.
52
+ ```
53
+
54
+ Don't silently fill in ambiguous requirements. The most common failure mode is making wrong assumptions and running with them unchecked. Surface uncertainty early — it's cheaper than rework.
55
+
56
+ ### 2. Manage Confusion Actively
57
+
58
+ When you encounter inconsistencies, conflicting requirements, or unclear specifications:
59
+
60
+ 1. **STOP.** Do not proceed with a guess.
61
+ 2. Name the specific confusion.
62
+ 3. Present the tradeoff or ask the clarifying question.
63
+ 4. Wait for resolution before continuing.
64
+
65
+ **Bad:** Silently picking one interpretation and hoping it's right.
66
+ **Good:** "I see X in the spec but Y in the existing code. Which takes precedence?"
67
+
68
+ ### 3. Push Back When Warranted
69
+
70
+ You are not a yes-machine. When an approach has clear problems:
71
+
72
+ - Point out the issue directly
73
+ - Explain the concrete downside (quantify when possible — "this adds ~200ms latency" not "this might be slower")
74
+ - Propose an alternative
75
+ - Accept the human's decision if they override with full information
76
+
77
+ Sycophancy is a failure mode. "Of course!" followed by implementing a bad idea helps no one. Honest technical disagreement is more valuable than false agreement.
78
+
79
+ ### 4. Enforce Simplicity
80
+
81
+ Your natural tendency is to overcomplicate. Actively resist it.
82
+
83
+ Before finishing any implementation, ask:
84
+
85
+ - Can this be done in fewer lines?
86
+ - Are these abstractions earning their complexity?
87
+ - Would a staff engineer look at this and say "why didn't you just..."?
88
+
89
+ If you build 1000 lines and 100 would suffice, you have failed. Prefer the boring, obvious solution. Cleverness is expensive.
90
+
91
+ ### 5. Maintain Scope Discipline
92
+
93
+ Touch only what you're asked to touch.
94
+
95
+ Do NOT:
96
+
97
+ - Remove comments you don't understand
98
+ - "Clean up" code orthogonal to the task
99
+ - Refactor adjacent systems as a side effect
100
+ - Delete code that seems unused without explicit approval
101
+ - Add features not in the spec because they "seem useful"
102
+
103
+ Your job is surgical precision, not unsolicited renovation.
104
+
105
+ ### 6. Verify, Don't Assume
106
+
107
+ Every skill includes a verification step. A task is not complete until verification passes. "Seems right" is never sufficient — there must be evidence (passing tests, build output, runtime data).
108
+
109
+ ## Failure Modes to Avoid
110
+
111
+ These are the subtle errors that look like productivity but create problems:
112
+
113
+ 1. Making wrong assumptions without checking
114
+ 2. Not managing your own confusion — plowing ahead when lost
115
+ 3. Not surfacing inconsistencies you notice
116
+ 4. Not presenting tradeoffs on non-obvious decisions
117
+ 5. Being sycophantic ("Of course!") to approaches with clear problems
118
+ 6. Overcomplicating code and APIs
119
+ 7. Modifying code or comments orthogonal to the task
120
+ 8. Removing things you don't fully understand
121
+ 9. Building without a spec because "it's obvious"
122
+ 10. Skipping verification because "it looks right"
123
+
124
+ ## Skill Rules
125
+
126
+ 1. **Check for an applicable skill before starting work.** Skills encode processes that prevent common mistakes.
127
+
128
+ 2. **Skills are workflows, not suggestions.** Follow the steps in order. Don't skip verification steps.
129
+
130
+ 3. **Multiple skills can apply.** A feature implementation might involve `idea-refine` → `spec-driven-development` → `planning-and-task-breakdown` → `incremental-implementation` → `test-driven-development` → `code-review-and-quality` → `shipping-and-launch` in sequence.
131
+
132
+ 4. **When in doubt, start with a spec.** If the task is non-trivial and there's no spec, begin with `spec-driven-development`.
133
+
134
+ ## Lifecycle Sequence
135
+
136
+ For a complete feature, the typical skill sequence is:
137
+
138
+ ```
139
+ 1. idea-refine → Refine vague ideas
140
+ 2. spec-driven-development → Define what we're building
141
+ 3. planning-and-task-breakdown → Break into verifiable chunks
142
+ 4. context-engineering → Load the right context
143
+ 5. incremental-implementation → Build slice by slice
144
+ 6. test-driven-development → Prove each slice works
145
+ 7. code-review-and-quality → Review before merge
146
+ 8. git-workflow-and-versioning → Clean commit history
147
+ 9. documentation-and-adrs → Document decisions
148
+ 10. shipping-and-launch → Deploy safely
149
+ ```
150
+
151
+ Not every task needs every skill. A bug fix might only need: `debugging-and-error-recovery` → `test-driven-development` → `code-review-and-quality`.
152
+
153
+ ## Quick Reference
154
+
155
+ | Phase | Skill | One-Line Summary |
156
+ | ------ | ----------------------------- | ----------------------------------------------------------------- |
157
+ | Define | idea-refine | Refine ideas through structured divergent and convergent thinking |
158
+ | Define | spec-driven-development | Requirements and acceptance criteria before code |
159
+ | Plan | planning-and-task-breakdown | Decompose into small, verifiable tasks |
160
+ | Build | incremental-implementation | Thin vertical slices, test each before expanding |
161
+ | Build | context-engineering | Right context at the right time |
162
+ | Build | frontend-ui-engineering | Production-quality UI with accessibility |
163
+ | Build | api-and-interface-design | Stable interfaces with clear contracts |
164
+ | Verify | test-driven-development | Failing test first, then make it pass |
165
+ | Verify | browser-testing-with-devtools | Chrome DevTools MCP for runtime verification |
166
+ | Verify | debugging-and-error-recovery | Reproduce → localize → fix → guard |
167
+ | Review | code-review-and-quality | Five-axis review with quality gates |
168
+ | Review | security-and-hardening | OWASP prevention, input validation, least privilege |
169
+ | Review | performance-optimization | Measure first, optimize only what matters |
170
+ | Ship | git-workflow-and-versioning | Atomic commits, clean history |
171
+ | Ship | ci-cd-and-automation | Automated quality gates on every change |
172
+ | Ship | documentation-and-adrs | Document the why, not just the what |
173
+ | Ship | shipping-and-launch | Pre-launch checklist, monitoring, rollback plan |
@@ -0,0 +1,14 @@
1
+ import {
2
+ analyzeTrajectories,
3
+ loadRoutingIntelligence,
4
+ toHistoricalStats,
5
+ wilsonLowerBound
6
+ } from "./chunk-M7BBX56R.js";
7
+ import "./chunk-Z6ZWNWWR.js";
8
+ export {
9
+ analyzeTrajectories,
10
+ loadRoutingIntelligence,
11
+ toHistoricalStats,
12
+ wilsonLowerBound
13
+ };
14
+ //# sourceMappingURL=trajectory-analyzer-ZAI2XUAI.js.map
@@ -2,11 +2,11 @@ import {
2
2
  TrajectoryRecorder,
3
3
  sftExamplesToJSONL,
4
4
  trajectoryToSFTExamples
5
- } from "./chunk-SWXTFHC7.js";
6
- import "./chunk-PZ5AY32C.js";
5
+ } from "./chunk-Z5D2QZY6.js";
6
+ import "./chunk-Z6ZWNWWR.js";
7
7
  export {
8
8
  TrajectoryRecorder,
9
9
  sftExamplesToJSONL,
10
10
  trajectoryToSFTExamples
11
11
  };
12
- //# sourceMappingURL=trajectory-capture-RF7TUN6I.js.map
12
+ //# sourceMappingURL=trajectory-capture-ERPIVYQJ.js.map
package/package.json CHANGED
@@ -1,33 +1,36 @@
1
1
  {
2
2
  "name": "@brainst0rm/core",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
8
8
  "import": "./dist/index.js"
9
- }
9
+ },
10
+ "./package.json": "./package.json"
10
11
  },
11
12
  "scripts": {
12
- "build": "tsup",
13
+ "build": "tsup && node scripts/copy-skills.mjs",
13
14
  "dev": "tsup --watch",
14
15
  "typecheck": "tsc --noEmit",
15
16
  "test": "vitest run"
16
17
  },
17
18
  "dependencies": {
18
- "@brainst0rm/agents": "0.13.0",
19
- "@brainst0rm/config": "0.13.0",
20
- "@brainst0rm/db": "0.13.0",
21
- "@brainst0rm/gateway": "0.13.0",
22
- "@brainst0rm/providers": "0.13.0",
23
- "@brainst0rm/router": "0.13.0",
24
- "@brainst0rm/shared": "0.13.0",
25
- "@brainst0rm/tools": "0.13.0",
19
+ "@brainst0rm/agents": "0.14.1",
20
+ "@brainst0rm/config": "0.14.1",
21
+ "@brainst0rm/db": "0.14.1",
22
+ "@brainst0rm/gateway": "0.14.1",
23
+ "@brainst0rm/orchestrator": "0.14.1",
24
+ "@brainst0rm/providers": "0.14.1",
25
+ "@brainst0rm/router": "0.14.1",
26
+ "@brainst0rm/shared": "0.14.1",
27
+ "@brainst0rm/tools": "0.14.1",
26
28
  "ai": "^6",
27
29
  "pdf-parse": "^2.4.5"
28
30
  },
29
31
  "devDependencies": {
30
32
  "@types/pdf-parse": "^1.1.5",
33
+ "fast-check": "^4.6.0",
31
34
  "tsup": "^8",
32
35
  "typescript": "^5.7"
33
36
  },
@@ -1,87 +0,0 @@
1
- // src/session/trajectory.ts
2
- import { mkdirSync, appendFile, existsSync } from "fs";
3
- import { join } from "path";
4
- import { homedir } from "os";
5
- var TrajectoryRecorder = class {
6
- filePath;
7
- sessionId;
8
- turn = 0;
9
- enabled;
10
- constructor(sessionId, enabled = true) {
11
- this.sessionId = sessionId;
12
- this.enabled = enabled;
13
- const dir = join(homedir(), ".brainstorm", "trajectories");
14
- if (!existsSync(dir)) {
15
- mkdirSync(dir, { recursive: true });
16
- }
17
- this.filePath = join(dir, `${sessionId}.jsonl`);
18
- }
19
- /** Set the current turn number. */
20
- setTurn(turn) {
21
- this.turn = turn;
22
- }
23
- /** Record a session start event. */
24
- recordSessionStart(metadata) {
25
- this.record("session-start", metadata);
26
- }
27
- /** Record an LLM call. */
28
- recordLLMCall(data) {
29
- this.record("llm-call", data);
30
- }
31
- /** Record a tool call (before execution). */
32
- recordToolCall(data) {
33
- this.record("tool-call", data);
34
- }
35
- /** Record a tool result (after execution). */
36
- recordToolResult(data) {
37
- this.record("tool-result", data);
38
- }
39
- /** Record a routing decision. */
40
- recordRoutingDecision(data) {
41
- this.record("routing-decision", data);
42
- }
43
- /** Record a turn summary (TurnContext snapshot). */
44
- recordTurnSummary(data) {
45
- this.record("turn-summary", data);
46
- }
47
- /** Record a compaction event. */
48
- recordCompaction(data) {
49
- this.record("compaction", data);
50
- }
51
- /** Record a trajectory reduction event. */
52
- recordReduction(data) {
53
- this.record(
54
- "trajectory-reduction",
55
- data
56
- );
57
- }
58
- /** Record an error. */
59
- recordError(data) {
60
- this.record("error", data);
61
- }
62
- /** Record session end. */
63
- recordSessionEnd(data) {
64
- this.record("session-end", data);
65
- }
66
- /** Get the trajectory file path. */
67
- getFilePath() {
68
- return this.filePath;
69
- }
70
- record(type, data) {
71
- if (!this.enabled) return;
72
- const event = {
73
- type,
74
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
75
- sessionId: this.sessionId,
76
- turn: this.turn,
77
- data
78
- };
79
- appendFile(this.filePath, JSON.stringify(event) + "\n", () => {
80
- });
81
- }
82
- };
83
-
84
- export {
85
- TrajectoryRecorder
86
- };
87
- //# sourceMappingURL=chunk-OU3NPQBH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/session/trajectory.ts"],"sourcesContent":["/**\n * Structured Trajectory Recording — JSONL event log for every agent interaction.\n *\n * Records LLM calls, tool executions, routing decisions, compaction events,\n * and errors as structured events. Enables:\n * - Post-hoc debugging\n * - SWE-bench evaluation\n * - BrainstormRouter intelligence feedback\n * - Cost analysis per task type\n *\n * Writes to ~/.brainstorm/trajectories/<session-id>.jsonl\n *\n * Inspired by Trae Agent's trajectory recording system, enhanced with\n * BrainstormRouter routing metadata that no other tool captures.\n */\n\nimport { mkdirSync, appendFile, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport type TrajectoryEventType =\n | \"session-start\"\n | \"llm-call\"\n | \"tool-call\"\n | \"tool-result\"\n | \"routing-decision\"\n | \"turn-summary\"\n | \"compaction\"\n | \"trajectory-reduction\"\n | \"error\"\n | \"session-end\";\n\nexport interface TrajectoryEvent {\n type: TrajectoryEventType;\n timestamp: string;\n sessionId: string;\n turn: number;\n data: Record<string, unknown>;\n}\n\nexport interface LLMCallData {\n model: string;\n provider: string;\n inputTokens: number;\n outputTokens: number;\n latencyMs: number;\n cost: number;\n strategy: string;\n}\n\nexport interface ToolCallData {\n name: string;\n input: Record<string, unknown>;\n durationMs: number;\n}\n\nexport interface ToolResultData {\n name: string;\n ok: boolean;\n error?: string;\n durationMs: number;\n}\n\nexport interface RoutingDecisionData {\n candidates: Array<{ model: string; score: number }>;\n winner: string;\n strategy: string;\n reasoning: string;\n taskType: string;\n complexity: string;\n}\n\n/**\n * Records agent trajectory events to JSONL files.\n */\nexport class TrajectoryRecorder {\n private filePath: string;\n private sessionId: string;\n private turn = 0;\n private enabled: boolean;\n\n constructor(sessionId: string, enabled = true) {\n this.sessionId = sessionId;\n this.enabled = enabled;\n\n const dir = join(homedir(), \".brainstorm\", \"trajectories\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n this.filePath = join(dir, `${sessionId}.jsonl`);\n }\n\n /** Set the current turn number. */\n setTurn(turn: number): void {\n this.turn = turn;\n }\n\n /** Record a session start event. */\n recordSessionStart(metadata: Record<string, unknown>): void {\n this.record(\"session-start\", metadata);\n }\n\n /** Record an LLM call. */\n recordLLMCall(data: LLMCallData): void {\n this.record(\"llm-call\", data as unknown as Record<string, unknown>);\n }\n\n /** Record a tool call (before execution). */\n recordToolCall(data: ToolCallData): void {\n this.record(\"tool-call\", data as unknown as Record<string, unknown>);\n }\n\n /** Record a tool result (after execution). */\n recordToolResult(data: ToolResultData): void {\n this.record(\"tool-result\", data as unknown as Record<string, unknown>);\n }\n\n /** Record a routing decision. */\n recordRoutingDecision(data: RoutingDecisionData): void {\n this.record(\"routing-decision\", data as unknown as Record<string, unknown>);\n }\n\n /** Record a turn summary (TurnContext snapshot). */\n recordTurnSummary(data: Record<string, unknown>): void {\n this.record(\"turn-summary\", data);\n }\n\n /** Record a compaction event. */\n recordCompaction(data: {\n messagesBefore: number;\n messagesAfter: number;\n tokensSaved: number;\n }): void {\n this.record(\"compaction\", data as unknown as Record<string, unknown>);\n }\n\n /** Record a trajectory reduction event. */\n recordReduction(data: {\n removedCount: number;\n tokensSaved: number;\n reasons: Record<string, number>;\n }): void {\n this.record(\n \"trajectory-reduction\",\n data as unknown as Record<string, unknown>,\n );\n }\n\n /** Record an error. */\n recordError(data: {\n message: string;\n recoveryAction?: string;\n model?: string;\n }): void {\n this.record(\"error\", data as unknown as Record<string, unknown>);\n }\n\n /** Record session end. */\n recordSessionEnd(data: {\n totalCost: number;\n totalTurns: number;\n durationMs: number;\n }): void {\n this.record(\"session-end\", data as unknown as Record<string, unknown>);\n }\n\n /** Get the trajectory file path. */\n getFilePath(): string {\n return this.filePath;\n }\n\n private record(\n type: TrajectoryEventType,\n data: Record<string, unknown>,\n ): void {\n if (!this.enabled) return;\n\n const event: TrajectoryEvent = {\n type,\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n turn: this.turn,\n data,\n };\n\n // Async write — trajectory recording is best-effort, never blocks the agent loop\n appendFile(this.filePath, JSON.stringify(event) + \"\\n\", () => {\n // Fire-and-forget — errors are silently ignored\n });\n }\n}\n"],"mappings":";AAgBA,SAAS,WAAW,YAAY,kBAAkB;AAClD,SAAS,YAAY;AACrB,SAAS,eAAe;AAyDjB,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAER,YAAY,WAAmB,UAAU,MAAM;AAC7C,SAAK,YAAY;AACjB,SAAK,UAAU;AAEf,UAAM,MAAM,KAAK,QAAQ,GAAG,eAAe,cAAc;AACzD,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,gBAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA,SAAK,WAAW,KAAK,KAAK,GAAG,SAAS,QAAQ;AAAA,EAChD;AAAA;AAAA,EAGA,QAAQ,MAAoB;AAC1B,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGA,mBAAmB,UAAyC;AAC1D,SAAK,OAAO,iBAAiB,QAAQ;AAAA,EACvC;AAAA;AAAA,EAGA,cAAc,MAAyB;AACrC,SAAK,OAAO,YAAY,IAA0C;AAAA,EACpE;AAAA;AAAA,EAGA,eAAe,MAA0B;AACvC,SAAK,OAAO,aAAa,IAA0C;AAAA,EACrE;AAAA;AAAA,EAGA,iBAAiB,MAA4B;AAC3C,SAAK,OAAO,eAAe,IAA0C;AAAA,EACvE;AAAA;AAAA,EAGA,sBAAsB,MAAiC;AACrD,SAAK,OAAO,oBAAoB,IAA0C;AAAA,EAC5E;AAAA;AAAA,EAGA,kBAAkB,MAAqC;AACrD,SAAK,OAAO,gBAAgB,IAAI;AAAA,EAClC;AAAA;AAAA,EAGA,iBAAiB,MAIR;AACP,SAAK,OAAO,cAAc,IAA0C;AAAA,EACtE;AAAA;AAAA,EAGA,gBAAgB,MAIP;AACP,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,MAIH;AACP,SAAK,OAAO,SAAS,IAA0C;AAAA,EACjE;AAAA;AAAA,EAGA,iBAAiB,MAIR;AACP,SAAK,OAAO,eAAe,IAA0C;AAAA,EACvE;AAAA;AAAA,EAGA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,OACN,MACA,MACM;AACN,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAM,QAAyB;AAAA,MAC7B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAGA,eAAW,KAAK,UAAU,KAAK,UAAU,KAAK,IAAI,MAAM,MAAM;AAAA,IAE9D,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1,10 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
5
- };
6
-
7
- export {
8
- __export
9
- };
10
- //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plan/trajectory-capture.ts","../src/security/secret-scanner.ts"],"sourcesContent":["/**\n * Trajectory Capture — records orchestration pipeline executions as training data.\n *\n * Every pipeline run produces a structured trajectory that captures:\n * - The user's request\n * - Each phase's agent, model, tools, cost, duration, and output quality\n * - The pipeline outcome (build pass, test pass, review findings)\n * - Feedback loops (review → re-implementation cycles)\n *\n * Trajectories are emitted as JSONL for:\n * 1. Local storage (~/.brainstorm/trajectories/orchestration/)\n * 2. BrainstormRouter Intelligence API (POST /v1/agent/trajectory)\n * 3. HuggingFace dataset push (justinjilg/brainstorm-orchestration-trajectories)\n *\n * This data trains BrainstormLLM v2 — the orchestration model.\n */\n\nimport { mkdirSync, appendFileSync, existsSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { redactCredentials } from \"../security/secret-scanner.js\";\nimport type {\n PipelineEvent,\n PipelinePhase,\n PhaseResult,\n} from \"./orchestration-pipeline.js\";\n\n// ── Types ──────────────────────────────────────────────────────────\n\nexport interface OrchestrationTrajectory {\n id: string;\n timestamp: string;\n request: string;\n projectPath: string;\n projectType?: string;\n phases: PhaseTrajectory[];\n outcome: PipelineOutcome;\n totalCost: number;\n totalDuration: number;\n feedbackLoops: FeedbackLoop[];\n}\n\nexport interface PhaseTrajectory {\n phase: PipelinePhase;\n agentId: string;\n modelUsed?: string;\n subagentType: string;\n toolCalls: string[];\n inputTokens?: number;\n outputTokens?: number;\n cost: number;\n duration: number;\n success: boolean;\n skipped: boolean;\n error?: string;\n outputLength: number;\n}\n\nexport interface PipelineOutcome {\n success: boolean;\n phasesCompleted: number;\n phasesTotal: number;\n buildPassed?: boolean;\n testsPassed?: boolean;\n reviewFindings: number;\n criticalFindings: number;\n filesChanged?: number;\n}\n\nexport interface FeedbackLoop {\n from: PipelinePhase;\n to: PipelinePhase;\n reason: string;\n timestamp: number;\n}\n\n// ── Trajectory Recorder ────────────────────────────────────────────\n\nconst TRAJECTORY_DIR = join(\n homedir(),\n \".brainstorm\",\n \"trajectories\",\n \"orchestration\",\n);\n\nexport class TrajectoryRecorder {\n private id: string;\n private request: string;\n private projectPath: string;\n private startTime: number;\n private phases: PhaseTrajectory[] = [];\n private feedbackLoops: FeedbackLoop[] = [];\n private currentPhase: Partial<PhaseTrajectory> | null = null;\n private outcome: PipelineOutcome = {\n success: false,\n phasesCompleted: 0,\n phasesTotal: 0,\n reviewFindings: 0,\n criticalFindings: 0,\n };\n\n constructor(request: string, projectPath: string) {\n this.id = randomUUID();\n this.request = request;\n this.projectPath = projectPath;\n this.startTime = Date.now();\n\n if (!existsSync(TRAJECTORY_DIR)) {\n mkdirSync(TRAJECTORY_DIR, { recursive: true });\n }\n }\n\n /** Process a pipeline event and record relevant data. */\n recordEvent(event: PipelineEvent): void {\n switch (event.type) {\n case \"pipeline-started\":\n this.outcome.phasesTotal = event.phases.length;\n break;\n\n case \"phase-started\":\n this.currentPhase = {\n phase: event.phase,\n agentId: event.agentId,\n cost: 0,\n duration: 0,\n success: false,\n skipped: false,\n toolCalls: [],\n outputLength: 0,\n };\n break;\n\n case \"phase-completed\":\n if (this.currentPhase) {\n this.phases.push({\n phase: event.result.phase,\n agentId: event.result.agentId,\n subagentType: \"auto\", // BR picks the model\n toolCalls: event.result.toolCalls,\n cost: event.result.cost,\n duration: event.result.duration,\n success: event.result.success,\n skipped: false,\n error: event.result.error,\n outputLength: event.result.output.length,\n });\n if (event.result.success) this.outcome.phasesCompleted++;\n this.currentPhase = null;\n }\n break;\n\n case \"phase-failed\":\n if (this.currentPhase) {\n this.phases.push({\n phase: event.phase,\n agentId: this.currentPhase.agentId ?? \"unknown\",\n subagentType: \"auto\",\n toolCalls: [],\n cost: 0,\n duration: 0,\n success: false,\n skipped: false,\n error: event.error,\n outputLength: 0,\n });\n this.currentPhase = null;\n }\n break;\n\n case \"review-findings\":\n this.outcome.reviewFindings = event.findings.length;\n this.outcome.criticalFindings = event.findings.filter(\n (f) => f.severity === \"critical\",\n ).length;\n break;\n\n case \"feedback-loop\":\n this.feedbackLoops.push({\n from: event.from,\n to: event.to,\n reason: event.reason,\n timestamp: Date.now(),\n });\n break;\n\n case \"pipeline-completed\":\n this.outcome.success =\n event.results.every((r) => r.success) && event.totalCost >= 0;\n this.outcome.phasesCompleted = event.results.filter(\n (r) => r.success,\n ).length;\n\n // Check verify phase for build/test results\n const verifyResult = event.results.find((r) => r.phase === \"verify\");\n if (verifyResult) {\n this.outcome.buildPassed =\n verifyResult.output.includes(\"Build: PASS\");\n this.outcome.testsPassed =\n verifyResult.output.includes(\"Tests: PASS\");\n }\n break;\n }\n }\n\n /** Finalize and persist the trajectory. Returns the trajectory object. */\n finalize(): OrchestrationTrajectory {\n const trajectory: OrchestrationTrajectory = {\n id: this.id,\n timestamp: new Date().toISOString(),\n request: redactCredentials(this.request),\n projectPath: basename(this.projectPath), // strip full path — only project name\n phases: this.phases,\n outcome: this.outcome,\n totalCost: this.phases.reduce((sum, p) => sum + p.cost, 0),\n totalDuration: Date.now() - this.startTime,\n feedbackLoops: this.feedbackLoops,\n };\n\n // Write to local JSONL (source of truth)\n const filename = `${new Date().toISOString().slice(0, 10)}.jsonl`;\n const filepath = join(TRAJECTORY_DIR, filename);\n appendFileSync(filepath, JSON.stringify(trajectory) + \"\\n\", \"utf-8\");\n\n // Push to BrainstormRouter (fire-and-forget, local is source of truth)\n this.pushToBR(trajectory).catch(() => {\n // Silent failure — local JSONL is the primary store\n });\n\n return trajectory;\n }\n\n /** Push trajectory to BrainstormRouter's trajectory endpoint. */\n private async pushToBR(trajectory: OrchestrationTrajectory): Promise<void> {\n const apiKey =\n process.env.BRAINSTORM_API_KEY ?? process.env.BRAINSTORM_ADMIN_KEY;\n if (!apiKey) return; // No key = skip push silently\n\n const res = await fetch(\n \"https://api.brainstormrouter.com/v1/agent/trajectories\",\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(trajectory),\n signal: AbortSignal.timeout(10_000),\n },\n );\n\n if (!res.ok) {\n // Log but don't throw — local JSONL is the real store\n const body = await res.text().catch(() => \"\");\n console.error(\n `[trajectory] BR push failed: ${res.status} ${body.slice(0, 200)}`,\n );\n }\n }\n\n /** Get the trajectory ID (for linking to BR API). */\n getId(): string {\n return this.id;\n }\n}\n\n// ── SFT Training Data Converter ────────────────────────────────────\n\n/**\n * Convert a trajectory into SFT training examples for BrainstormLLM v2.\n *\n * Each phase in the trajectory becomes one training example:\n * - Input: request + phase + project context\n * - Label: what worked (agent, tools, cost, duration)\n * - Weight: pipeline outcome quality (success = 1.0, partial = 0.5, fail = 0.1)\n */\nexport function trajectoryToSFTExamples(\n trajectory: OrchestrationTrajectory,\n): Array<{ input: string; label: string; weight: number }> {\n const examples: Array<{ input: string; label: string; weight: number }> = [];\n\n // Outcome weight: successful pipelines are worth more as training data\n const outcomeWeight = trajectory.outcome.success\n ? 1.0\n : trajectory.outcome.phasesCompleted /\n Math.max(trajectory.outcome.phasesTotal, 1) >\n 0.5\n ? 0.5\n : 0.1;\n\n for (const phase of trajectory.phases) {\n if (phase.skipped) continue;\n\n const input = [\n `request: ${trajectory.request}`,\n `phase: ${phase.phase}`,\n `project_path: ${trajectory.projectPath}`,\n `budget_remaining: $${(trajectory.totalCost > 0 ? trajectory.totalCost : 1.0).toFixed(2)}`,\n `phases_completed: ${trajectory.phases.indexOf(phase)}`,\n `feedback_loops: ${trajectory.feedbackLoops.length}`,\n ].join(\"\\n\");\n\n const label = [\n `agent: ${phase.agentId}`,\n `tools: ${phase.toolCalls.join(\",\") || \"none\"}`,\n `estimated_cost: $${phase.cost.toFixed(4)}`,\n `max_steps: ${Math.ceil(phase.duration / 5000) || 5}`,\n `skip: ${phase.skipped}`,\n `success: ${phase.success}`,\n ].join(\"\\n\");\n\n examples.push({ input, label, weight: outcomeWeight });\n }\n\n return examples;\n}\n\n/**\n * Format SFT examples as JSONL for training.\n */\nexport function sftExamplesToJSONL(\n examples: Array<{ input: string; label: string; weight: number }>,\n): string {\n return examples\n .map((ex) =>\n JSON.stringify({\n messages: [\n {\n role: \"system\",\n content:\n \"You are BrainstormLLM, an orchestration model that predicts how to structure software development pipelines. Given a request and context, predict which agent, tools, and resource allocation to use for the current phase.\",\n },\n { role: \"user\", content: ex.input },\n { role: \"assistant\", content: ex.label },\n ],\n weight: ex.weight,\n }),\n )\n .join(\"\\n\");\n}\n","/**\n * Scans text for credential patterns and redacts them before sending to LLM providers.\n * 19 regex patterns matching common credential formats.\n */\n\nconst CREDENTIAL_PATTERNS: Array<{ name: string; pattern: RegExp }> = [\n // AWS\n { name: \"AWS Access Key\", pattern: /AKIA[0-9A-Z]{16}/g },\n {\n name: \"AWS Credential\",\n pattern:\n /(?:aws_secret_access_key|secret_key)\\s*[:=]\\s*['\"]?([A-Za-z0-9/+=]{40})['\"]?/gi,\n },\n {\n name: \"AWS Session Token\",\n pattern:\n /(?:aws_session_token)\\s*[:=]\\s*['\"]?([A-Za-z0-9/+=]{100,})['\"]?/gi,\n },\n // GitHub\n { name: \"GitHub Token\", pattern: /gh[ps]_[A-Za-z0-9_]{36,}/g },\n { name: \"GitHub OAuth\", pattern: /gho_[A-Za-z0-9_]{36,}/g },\n { name: \"GitHub Fine-grained\", pattern: /github_pat_[A-Za-z0-9_]{22,}/g },\n // AI Providers\n { name: \"OpenAI Key\", pattern: /sk-[A-Za-z0-9]{20,}/g },\n { name: \"Anthropic Key\", pattern: /sk-ant-[A-Za-z0-9-]{20,}/g },\n { name: \"Google/Gemini API Key\", pattern: /AIza[A-Za-z0-9_-]{35}/g },\n // Payment / SaaS\n { name: \"Stripe Key\", pattern: /(?:sk|pk)_(?:live|test)_[A-Za-z0-9]{20,}/g },\n { name: \"Slack Token\", pattern: /xox[bpras]-[A-Za-z0-9-]{10,}/g },\n { name: \"Twilio Key\", pattern: /SK[0-9a-fA-F]{32}/g },\n {\n name: \"SendGrid Key\",\n pattern: /SG\\.[A-Za-z0-9_-]{22}\\.[A-Za-z0-9_-]{43}/g,\n },\n // General\n {\n name: \"PEM Private Key\",\n pattern: /-----BEGIN (?:RSA |EC )?PRIVATE KEY-----/g,\n },\n { name: \"Basic Auth URL\", pattern: /https?:\\/\\/[^:]+:[^@]+@/g },\n {\n name: \"Generic Credential\",\n pattern:\n /(?:password|secret|token|api_key|apikey)\\s*[:=]\\s*['\"]?([A-Za-z0-9/+_.~-]{8,})['\"]?/gi,\n },\n {\n name: \"JWT\",\n pattern:\n /eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n },\n { name: \"BR API Key\", pattern: /br_(?:live|test)_[A-Za-z0-9]{20,}/g },\n { name: \"NPM Token\", pattern: /npm_[A-Za-z0-9]{36}/g },\n];\n\nexport interface ScanResult {\n hasFindings: boolean;\n findings: Array<{ name: string; position: number; preview: string }>;\n}\n\n/**\n * Scan text for credential patterns.\n */\nexport function scanForCredentials(text: string): ScanResult {\n const findings: ScanResult[\"findings\"] = [];\n\n for (const { name, pattern } of CREDENTIAL_PATTERNS) {\n pattern.lastIndex = 0;\n let match;\n while ((match = pattern.exec(text)) !== null) {\n findings.push({\n name,\n position: match.index,\n preview: match[0].slice(0, 6) + \"...[REDACTED]\",\n });\n }\n }\n\n return { hasFindings: findings.length > 0, findings };\n}\n\n/**\n * Redact all detected credentials in text.\n */\nexport function redactCredentials(text: string): string {\n let result = text;\n for (const { pattern } of CREDENTIAL_PATTERNS) {\n pattern.lastIndex = 0;\n result = result.replace(pattern, \"[REDACTED]\");\n }\n return result;\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +0,0 @@
1
- import {
2
- TrajectoryRecorder
3
- } from "./chunk-OU3NPQBH.js";
4
- import "./chunk-PZ5AY32C.js";
5
- export {
6
- TrajectoryRecorder
7
- };
8
- //# sourceMappingURL=trajectory-MOCIJBV6.js.map