@noorm/marie-cli 0.1.15 → 0.1.17

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 (103) hide show
  1. package/.marie_visual_verify_1771225696548/progress_bar_check.txt +1 -0
  2. package/SENTINEL.md +33 -0
  3. package/dist/cli-new/components/App.js +3 -1
  4. package/dist/cli-new/components/App.js.map +1 -1
  5. package/dist/cli-new/components/Banner.js +5 -5
  6. package/dist/cli-new/components/Banner.js.map +1 -1
  7. package/dist/cli-new/hooks/useUpdateCheck.js +17 -0
  8. package/dist/cli-new/hooks/useUpdateCheck.js.map +1 -0
  9. package/dist/domain/DomainEntity.js +7 -0
  10. package/dist/domain/DomainEntity.js.map +1 -0
  11. package/dist/extension.cjs +164 -154
  12. package/dist/extension.js +473 -0
  13. package/dist/extension.js.map +1 -0
  14. package/dist/infrastructure/BaseAdapter.js +3 -0
  15. package/dist/infrastructure/BaseAdapter.js.map +1 -0
  16. package/dist/monolith/cli/CliFileSystemPort.js +16 -8
  17. package/dist/monolith/cli/CliFileSystemPort.js.map +1 -1
  18. package/dist/monolith/cli/MarieToolDefinitionsCLI.js +9 -6
  19. package/dist/monolith/cli/MarieToolDefinitionsCLI.js.map +1 -1
  20. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js +1 -1
  21. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js.map +1 -1
  22. package/dist/monolith/infrastructure/ai/core/MarieEngine.js +29 -10
  23. package/dist/monolith/infrastructure/ai/core/MarieEngine.js.map +1 -1
  24. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js +19 -13
  25. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js.map +1 -1
  26. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js +8 -8
  27. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js.map +1 -1
  28. package/dist/monolith/infrastructure/config/ConfigService.js +2 -22
  29. package/dist/monolith/infrastructure/config/ConfigService.js.map +1 -1
  30. package/dist/monolith/infrastructure/joy/JoyTools.js +535 -0
  31. package/dist/monolith/infrastructure/joy/JoyTools.js.map +1 -0
  32. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js +14 -13
  33. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js.map +1 -1
  34. package/dist/monolith/plumbing/analysis/MarieSentinelService.js +23 -3
  35. package/dist/monolith/plumbing/analysis/MarieSentinelService.js.map +1 -1
  36. package/dist/monolith/plumbing/analysis/TestService.js +2 -1
  37. package/dist/monolith/plumbing/analysis/TestService.js.map +1 -1
  38. package/dist/monolith/plumbing/filesystem/FileService.js +22 -10
  39. package/dist/monolith/plumbing/filesystem/FileService.js.map +1 -1
  40. package/dist/monolith/plumbing/utils/EnvironmentUtils.js +59 -0
  41. package/dist/monolith/plumbing/utils/EnvironmentUtils.js.map +1 -0
  42. package/dist/monolith/plumbing/utils/MutexUtils.js +86 -0
  43. package/dist/monolith/plumbing/utils/MutexUtils.js.map +1 -0
  44. package/dist/monolith/runtime/MarieRuntime.js +250 -136
  45. package/dist/monolith/runtime/MarieRuntime.js.map +1 -1
  46. package/dist/monolith/runtime/RuntimeAdapterBase.js +6 -0
  47. package/dist/monolith/runtime/RuntimeAdapterBase.js.map +1 -1
  48. package/dist/monolith/services/JoyAutomationService.js +1 -1
  49. package/dist/monolith/services/JoyAutomationService.js.map +1 -1
  50. package/dist/monolith/services/JoyService.js +1 -1
  51. package/dist/monolith/services/JoyService.js.map +1 -1
  52. package/dist/monolith/services/UpdateService.js +61 -0
  53. package/dist/monolith/services/UpdateService.js.map +1 -0
  54. package/dist/plumbing/BaseTool.js +7 -0
  55. package/dist/plumbing/BaseTool.js.map +1 -0
  56. package/dist/prompts.js +90 -0
  57. package/dist/prompts.js.map +1 -0
  58. package/dist/test_agent_stream_control_plane.js +170 -0
  59. package/dist/test_agent_stream_control_plane.js.map +1 -0
  60. package/dist/test_content_buffer_cap.js +67 -0
  61. package/dist/test_content_buffer_cap.js.map +1 -0
  62. package/dist/test_prefix_tree.js +120 -0
  63. package/dist/test_prefix_tree.js.map +1 -0
  64. package/dist/test_retry_utils.js +169 -0
  65. package/dist/test_retry_utils.js.map +1 -0
  66. package/dist/test_strategy_integration.js +114 -0
  67. package/dist/test_strategy_integration.js.map +1 -0
  68. package/dist/test_streaming_fragility.js +191 -0
  69. package/dist/test_streaming_fragility.js.map +1 -0
  70. package/dist/webview-ui/App.js +16 -0
  71. package/dist/webview-ui/App.js.map +1 -0
  72. package/dist/webview-ui/Providers.js +6 -0
  73. package/dist/webview-ui/Providers.js.map +1 -0
  74. package/dist/webview-ui/components/ApprovalPanel.js +8 -0
  75. package/dist/webview-ui/components/ApprovalPanel.js.map +1 -0
  76. package/dist/webview-ui/components/ChatPanel.js +19 -0
  77. package/dist/webview-ui/components/ChatPanel.js.map +1 -0
  78. package/dist/webview-ui/components/Composer.js +19 -0
  79. package/dist/webview-ui/components/Composer.js.map +1 -0
  80. package/dist/webview-ui/components/HeaderBar.js +5 -0
  81. package/dist/webview-ui/components/HeaderBar.js.map +1 -0
  82. package/dist/webview-ui/components/SessionList.js +14 -0
  83. package/dist/webview-ui/components/SessionList.js.map +1 -0
  84. package/dist/webview-ui/context/WebviewStateContext.js +146 -0
  85. package/dist/webview-ui/context/WebviewStateContext.js.map +1 -0
  86. package/dist/webview-ui/main.css +1 -0
  87. package/dist/webview-ui/main.js +108 -0
  88. package/dist/webview-ui/main.js.map +1 -0
  89. package/dist/webview-ui/types.js +2 -0
  90. package/dist/webview-ui/types.js.map +1 -0
  91. package/dist/webview-ui/vscode.js +4 -0
  92. package/dist/webview-ui/vscode.js.map +1 -0
  93. package/lint_output.txt +705 -0
  94. package/lint_output_v2.txt +711 -0
  95. package/marie-coder-0.1.16.vsix +0 -0
  96. package/package.json +3 -10
  97. package/JOY_ZONING.md +0 -200
  98. package/dist/monolith/tests/FileAppendVerifyTest.js +0 -28
  99. package/dist/monolith/tests/FileAppendVerifyTest.js.map +0 -1
  100. package/dist/monolith/tests/StreamingVerifyTest.js +0 -100
  101. package/dist/monolith/tests/StreamingVerifyTest.js.map +0 -1
  102. package/dist/monolith/tests/VisualProgressTest.js +0 -86
  103. package/dist/monolith/tests/VisualProgressTest.js.map +0 -1
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@noorm/marie-cli",
3
3
  "displayName": "MarieCoder",
4
- "version": "0.1.15",
4
+ "version": "0.1.17",
5
5
  "icon": "assets/icon.png",
6
6
  "description": "A sentient AI pair programmer for your terminal",
7
7
  "publisher": "DreamBeesAI",
@@ -14,16 +14,9 @@
14
14
  "type": "git",
15
15
  "url": "git+https://github.com/DreamBeesAI/Marie-Coder-New-the-vatican.git"
16
16
  },
17
- "files": [
18
- "dist/cli-new",
19
- "dist/monolith",
20
- "README.md",
21
- "LICENSE.md",
22
- "JOY_ZONING.md"
23
- ],
24
17
  "main": "dist/extension.cjs",
25
18
  "engines": {
26
- "vscode": "^1.105.0",
19
+ "vscode": "^1.95.0",
27
20
  "node": ">=18.0.0"
28
21
  },
29
22
  "categories": [
@@ -144,7 +137,7 @@
144
137
  "@types/node": "^20.0.0",
145
138
  "@types/react": "^18.3.0",
146
139
  "@types/react-dom": "^18.3.0",
147
- "@types/vscode": "^1.105.0",
140
+ "@types/vscode": "^1.95.0",
148
141
  "@typescript-eslint/eslint-plugin": "^8.55.0",
149
142
  "@typescript-eslint/parser": "^8.55.0",
150
143
  "@vscode/test-electron": "^2.5.1",
package/JOY_ZONING.md DELETED
@@ -1,200 +0,0 @@
1
- # Joy Zoning Protocol 🌸 (v5)
2
-
3
- Non-joyful code is not a moral failure.
4
- It is often necessary infrastructure, transitional work, or support plumbing.
5
-
6
- Joy Zoning exists to protect clarity, reduce cognitive load, and preserve creative space.
7
- The goal is containment—not shame.
8
-
9
- ## The Core Principle
10
-
11
- **All code has a home.**
12
- Code without a home becomes clutter.
13
-
14
- We do not delete necessary complexity.
15
- We name it, place it, and limit its spread.
16
-
17
- ## The Prime Directive
18
-
19
- **Joyful zones must be defended.**
20
- **Non-joyful zones must be honest.**
21
-
22
- This protocol optimizes for long-term human comprehension, not short-term velocity.
23
-
24
- ## Zones (with Intent)
25
-
26
- ### 1. Joyful Code ✨
27
-
28
- * **Purpose**: Expression and meaning
29
- * **Question**: Is this the reason the system exists?
30
- * **Location**: `src/domain/`, core application flows
31
-
32
- **Characteristics**:
33
- * Expressive
34
- * Intentional
35
- * Readable
36
-
37
- **Constraints**:
38
- * No adapters
39
- * No glue
40
- * No “just in case” logic
41
- * No environment awareness
42
- * No orchestration logic
43
- * **Protected Zone**: Complexity must justify its presence
44
-
45
- *Joyful code is where humans think. Guard it fiercely.*
46
-
47
- ### 2. Infrastructure 🏗️
48
-
49
- * **Purpose**: Stability and coordination
50
- * **Question**: Does this absorb complexity so the system stays calm?
51
- * **Location**: `src/infrastructure/`
52
-
53
- **Characteristics**:
54
- * Heavy
55
- * Necessary
56
- * Emotionally flat
57
-
58
- **Examples**:
59
- * Config loaders
60
- * AI clients
61
- * Registries
62
- * State bridges
63
- * Dependency wiring
64
-
65
- **Constraints**:
66
- * Must terminate complexity
67
- * Must not leak abstractions upward
68
- * Must be replaceable without touching domain logic
69
- * Should be boring to read
70
-
71
- *Infrastructure exists so joyful code doesn’t have to care.*
72
-
73
- ### 3. Plumbing 🔧
74
-
75
- * **Purpose**: Mechanical execution
76
- * **Question**: Is this unavoidable work best treated as machinery?
77
- * **Location**: `src/plumbing/`
78
-
79
- **Characteristics**:
80
- * Low-level
81
- * Mechanical
82
- * Replaceable
83
-
84
- **Examples**:
85
- * Filesystem I/O
86
- * Git wrappers
87
- * Shell execution
88
- * Static analysis primitives
89
-
90
- **Constraints**:
91
- * Explicit boundaries
92
- * Minimal surface area
93
- * No domain knowledge
94
- * No opinionated logic
95
- * No lifecycle awareness
96
-
97
- *Plumbing is respected, but never romanticized.*
98
-
99
- ## Dependency Law (Hard Rule) 📐
100
-
101
- Dependencies may only flow downward.
102
-
103
- | From \ To | Joyful | Infrastructure | Plumbing |
104
- | :--- | :---: | :---: | :---: |
105
- | **Joyful** | ✅ | ✅ | ❌ |
106
- | **Infrastructure** | ❌ | ✅ | ✅ |
107
- | **Plumbing** | ❌ | ❌ | ✅ |
108
-
109
- **Rule**: If you violate this table, zoning has failed.
110
- This rule exists to prevent conceptual backflow.
111
-
112
- ## Project Formation Rule 🧱
113
-
114
- There are no generic buckets.
115
-
116
- ❌ `utils.ts`
117
- ❌ `helpers/`
118
-
119
- ✅ `filesystem/`
120
- ✅ `analysis/`
121
- ✅ `formatting/`
122
-
123
- Every file belongs to a **Project** that explains what responsibility it owns.
124
- If you cannot name the project, the code is not ready to exist.
125
-
126
- ## Lifecycle & Movement
127
-
128
- Code is allowed—and expected—to move.
129
-
130
- 1. **Sprout → Joyful**: When intent becomes legible.
131
- 2. **Joyful → Infrastructure**: When patterns stabilize and repetition appears.
132
- 3. **Infrastructure → Plumbing**: When logic becomes mechanical or commoditized.
133
- 4. **Any → Compost**: When obsolete. Trust version control.
134
-
135
- *Movement is maturity, not failure.*
136
-
137
- ## Pressure Valves 🔋
138
-
139
- Pressure valves allow temporary disorder without dishonesty.
140
-
141
- **Allowed**:
142
- * Flat files
143
- * TODOs with intent
144
- * Unzoned drafts
145
-
146
- **Rules**:
147
- 1. Must be acknowledged.
148
- 2. Must answer: “Where does this belong once it settles?”
149
- 3. Are not permanent homes.
150
-
151
- *Pressure valves prevent premature abstraction and false cleanliness.*
152
-
153
- ## Agent & Automation Contract 🤖
154
-
155
- When AI agents or automated tools interact with this codebase:
156
- * Agents may observe and suggest, never enforce.
157
- * Agents may flag heaviness, never moralize.
158
- * Agents must prefer containment over refactor.
159
- * Agents must not invent zones, projects, or abstractions without human approval.
160
- * Agents must never optimize for “elegance” over placement.
161
-
162
- *Agents assist judgment. They do not replace it.*
163
-
164
- ## Review & Maintenance Cadence (NEW) 📅
165
-
166
- Joy Zoning is enforced continuously, lightly.
167
-
168
- * **During development**: Ask “Where does this belong?”
169
- * **During review**: Ask “Is this carrying the right amount of meaning?”
170
- * **Periodically**: Relocate, don’t redesign.
171
-
172
- *There are no “zoning sprints.” Tidying is part of normal work.*
173
-
174
- ## Reviewer Heuristics (Fast Checks)
175
-
176
- * “Why does this live here?”
177
- * “What zone would this fall into if it grew 3×?”
178
- * “Is this protecting joyful code—or polluting it?”
179
- * “Is this doing thinking it shouldn’t be doing?”
180
-
181
- *If the answer feels fuzzy, pause. Do not invent abstractions to escape discomfort.*
182
-
183
- ## Failure Conditions (Explicit) 🚨
184
-
185
- Joy Zoning has failed if it:
186
- 1. Becomes a gatekeeping tool.
187
- 2. Encourages hiding work.
188
- 3. Replaces judgment with ritual.
189
- 4. Rewards cleverness over clarity.
190
- 5. Lets agents override humans.
191
-
192
- *When this happens, simplify the protocol, not the people.*
193
-
194
- ## Final Safeguard
195
-
196
- This protocol exists to reduce suffering, not to increase purity.
197
-
198
- Clarity is the goal.
199
- Joy is the signal.
200
- Humans are the authority.
@@ -1,28 +0,0 @@
1
- import * as fs from "fs";
2
- import * as path from "path";
3
- import { appendToFile } from "../plumbing/filesystem/FileService.js";
4
- async function verifyFileAppend() {
5
- const testFile = path.join(process.cwd(), "test_append.txt");
6
- if (fs.existsSync(testFile))
7
- fs.unlinkSync(testFile);
8
- console.log(`Verifying appendToFile for: ${testFile}`);
9
- let totalBytesAppended = 0;
10
- const onProgress = (b) => {
11
- totalBytesAppended += b;
12
- console.log(`Progress: +${b} bytes (Total: ${totalBytesAppended})`);
13
- };
14
- await appendToFile(testFile, "Line 1\n", undefined, onProgress);
15
- await appendToFile(testFile, "Line 2\n", undefined, onProgress);
16
- const content = fs.readFileSync(testFile, "utf-8");
17
- console.log(`Content:\n${content}`);
18
- if (content !== "Line 1\nLine 2\n") {
19
- throw new Error("File append verification failed!");
20
- }
21
- console.log("✅ File append verification successful!");
22
- fs.unlinkSync(testFile);
23
- }
24
- verifyFileAppend().catch((err) => {
25
- console.error("❌ Verification failed:", err);
26
- process.exit(1);
27
- });
28
- //# sourceMappingURL=FileAppendVerifyTest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileAppendVerifyTest.js","sourceRoot":"","sources":["../../../src/monolith/tests/FileAppendVerifyTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAErE,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAE7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAEvD,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE;QAC/B,kBAAkB,IAAI,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,kBAAkB,GAAG,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IAEpC,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC/B,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,100 +0,0 @@
1
- import * as fs from "fs";
2
- import * as path from "path";
3
- import * as os from "os";
4
- import { SessionLogService } from "../infrastructure/ai/core/SessionLogService.js";
5
- import { CliFileSystemPort } from "../cli/CliFileSystemPort.js";
6
- import { MarieProgressTracker } from "../infrastructure/ai/core/MarieProgressTracker.js";
7
- import { MarieToolProcessor } from "../infrastructure/ai/core/MarieToolProcessor.js";
8
- import { ToolRegistry } from "../infrastructure/tools/ToolRegistry.js";
9
- import { registerSharedToolDefinitions } from "../infrastructure/tools/SharedToolDefinitions.js";
10
- async function verifyStreaming() {
11
- const workingDir = path.join(process.cwd(), `.marie_streaming_verify_${Date.now()}`);
12
- fs.mkdirSync(workingDir, { recursive: true });
13
- const sessionId = `test_streaming_${Date.now()}`;
14
- const logService = new SessionLogService(sessionId);
15
- console.log(`Starting streaming & persistence verification for session: ${sessionId}`);
16
- const cliFs = new CliFileSystemPort(workingDir);
17
- const registry = new ToolRegistry();
18
- // Register shared tools
19
- registerSharedToolDefinitions(registry, {
20
- resolvePath: (p) => (path.isAbsolute(p) ? p : path.join(workingDir, p)),
21
- writeFile: (p, c, s, onProgress) => cliFs.writeFile(p, c, s, onProgress),
22
- appendFile: (p, c, s, onProgress) => cliFs.appendFile(p, c, s, onProgress),
23
- readFile: (p, s, e, sig) => cliFs.readFile(p, sig),
24
- listDir: (p, sig) => Promise.resolve(""),
25
- grepSearch: (q, p, sig) => Promise.resolve(""),
26
- getGitContext: () => Promise.resolve(""),
27
- });
28
- const emittedEvents = [];
29
- const tracker = new MarieProgressTracker({
30
- onEvent: async (e) => {
31
- emittedEvents.push(e);
32
- await logService.appendEvent(e);
33
- },
34
- }, {
35
- runId: "streaming_run",
36
- startedAt: Date.now(),
37
- steps: 0,
38
- tools: 0,
39
- objectives: [],
40
- achieved: [],
41
- });
42
- const processor = new MarieToolProcessor(registry, tracker, async () => true, {
43
- spiritPressure: 100,
44
- toolHistory: [],
45
- techniqueExecutions: [],
46
- mood: "CAUTIOUS",
47
- errorHotspots: {},
48
- totalErrorCount: 0,
49
- victoryStreak: 0,
50
- }, cliFs);
51
- // Large content (>16KB to trigger chunking)
52
- const totalSize = 50000;
53
- const largeContent = "S".repeat(totalSize);
54
- const filePath = path.join(workingDir, "streaming_test.txt");
55
- console.log("Executing write_to_file with 50KB content...");
56
- const result = await processor.process({
57
- id: "call_streaming",
58
- name: "write_to_file",
59
- input: { path: filePath, content: largeContent },
60
- });
61
- console.log(`Tool Result: ${result}`);
62
- // Verify events
63
- const deltas = emittedEvents.filter((e) => e.type === "file_stream_delta");
64
- console.log(`Verification: ${deltas.length} file_stream_delta events emitted.`);
65
- if (deltas.length < 2) {
66
- throw new Error(`Insufficient streaming deltas! Expected > 1, got ${deltas.length}`);
67
- }
68
- const lastDelta = deltas[deltas.length - 1];
69
- if (lastDelta.bytesWritten !== totalSize ||
70
- lastDelta.totalBytes !== totalSize) {
71
- throw new Error(`Final delta mismatch! Expected ${totalSize} bytes, got ${lastDelta.bytesWritten}`);
72
- }
73
- // Verify stage was changed to "editing"
74
- const stages = emittedEvents.filter((e) => e.type === "stage" && e.stage === "editing");
75
- if (stages.length === 0) {
76
- throw new Error("Missing 'editing' stage event!");
77
- }
78
- console.log(`Verification: 'editing' stage detected correctly.`);
79
- // Verify persistence
80
- const logPath = path.join(os.homedir(), ".marie", "logs", "sessions", `${sessionId}.jsonl`);
81
- const logContent = fs.readFileSync(logPath, "utf-8");
82
- const logLines = logContent.trim().split("\n");
83
- console.log(`Log Content Check: ${logLines.length} lines persisted.`);
84
- if (logLines.length === 0) {
85
- throw new Error("Log file is empty!");
86
- }
87
- const recoveredEvents = logLines.map((l) => JSON.parse(l));
88
- const persistedDeltas = recoveredEvents.filter((e) => e.type === "file_stream_delta");
89
- if (persistedDeltas.length !== deltas.length) {
90
- throw new Error(`Persistence mismatch! Expected ${deltas.length} deltas, got ${persistedDeltas.length}`);
91
- }
92
- console.log("✅ Granular file streaming & high-integrity persistence verified!");
93
- // Cleanup
94
- fs.rmSync(workingDir, { recursive: true, force: true });
95
- }
96
- verifyStreaming().catch((err) => {
97
- console.error("❌ Verification FAILED:", err);
98
- process.exit(1);
99
- });
100
- //# sourceMappingURL=StreamingVerifyTest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StreamingVerifyTest.js","sourceRoot":"","sources":["../../../src/monolith/tests/StreamingVerifyTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AAEjG,KAAK,UAAU,eAAe;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,OAAO,CAAC,GAAG,EAAE,EACb,2BAA2B,IAAI,CAAC,GAAG,EAAE,EAAE,CACxC,CAAC;IACF,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAG,kBAAkB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CACT,8DAA8D,SAAS,EAAE,CAC1E,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IAEpC,wBAAwB;IACxB,6BAA6B,CAAC,QAAQ,EAAE;QACtC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACvE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;QACxE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;QAC1E,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAClD,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAU,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,oBAAoB,CACtC;QACE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YACnB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;KACF,EACD;QACE,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,kBAAkB,CACtC,QAAQ,EACR,OAAO,EACP,KAAK,IAAI,EAAE,CAAC,IAAI,EAChB;QACE,cAAc,EAAE,GAAG;QACnB,WAAW,EAAE,EAAE;QACf,mBAAmB,EAAE,EAAE;QACvB,IAAI,EAAE,UAAU;QAChB,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,CAAC;KACV,EACR,KAAK,CACN,CAAC;IAEF,4CAA4C;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;QACrC,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;KACjD,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IAEtC,gBAAgB;IAChB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CACT,iBAAiB,MAAM,CAAC,MAAM,oCAAoC,CACnE,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,oDAAoD,MAAM,CAAC,MAAM,EAAE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5C,IACE,SAAS,CAAC,YAAY,KAAK,SAAS;QACpC,SAAS,CAAC,UAAU,KAAK,SAAS,EAClC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,kCAAkC,SAAS,eAAe,SAAS,CAAC,YAAY,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CACnD,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IAEjE,qBAAqB;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,EAAE,CAAC,OAAO,EAAE,EACZ,QAAQ,EACR,MAAM,EACN,UAAU,EACV,GAAG,SAAS,QAAQ,CACrB,CAAC;IACF,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CACtC,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,CAAC,MAAM,gBAAgB,eAAe,CAAC,MAAM,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CACT,kEAAkE,CACnE,CAAC;IAEF,UAAU;IACV,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,86 +0,0 @@
1
- import * as fs from "fs";
2
- import * as path from "path";
3
- import { CliFileSystemPort } from "../cli/CliFileSystemPort.js";
4
- import { MarieProgressTracker } from "../infrastructure/ai/core/MarieProgressTracker.js";
5
- import { MarieToolProcessor } from "../infrastructure/ai/core/MarieToolProcessor.js";
6
- import { ToolRegistry } from "../infrastructure/tools/ToolRegistry.js";
7
- import { registerSharedToolDefinitions } from "../infrastructure/tools/SharedToolDefinitions.js";
8
- async function verifyVisualProgressBar() {
9
- console.log("Starting Visual Progress Bar Verification...");
10
- const workingDir = path.join(process.cwd(), `.marie_visual_verify_${Date.now()}`);
11
- fs.mkdirSync(workingDir, { recursive: true });
12
- const cliFs = new CliFileSystemPort(workingDir);
13
- const registry = new ToolRegistry();
14
- // Register only the shared tools we need for testing
15
- registerSharedToolDefinitions(registry, {
16
- resolvePath: (p) => (path.isAbsolute(p) ? p : path.join(workingDir, p)),
17
- writeFile: (p, c, s, onProgress) => cliFs.writeFile(p, c, s, onProgress),
18
- appendFile: (p, c, s, onProgress) => cliFs.appendFile(p, c, s, onProgress),
19
- readFile: (p, s, e, sig) => cliFs.readFile(p, sig),
20
- listDir: (p, sig) => Promise.resolve(""),
21
- grepSearch: (q, p, sig) => Promise.resolve(""),
22
- getGitContext: () => Promise.resolve(""),
23
- });
24
- const eventLogs = [];
25
- const tracker = new MarieProgressTracker({
26
- onEvent: (e) => {
27
- if (e.type === "file_stream_delta") {
28
- eventLogs.push(e);
29
- // MOCK THE CLI RENDERER LOGIC HERE
30
- if (e.totalBytes) {
31
- const pct = Math.round((e.bytesWritten / e.totalBytes) * 100);
32
- const barWidth = 10;
33
- const completed = Math.round((barWidth * pct) / 100);
34
- const bar = "=".repeat(completed) +
35
- ">" +
36
- " ".repeat(Math.max(0, barWidth - completed));
37
- const fileName = e.path.split("/").pop();
38
- console.log(`[CLI MOCK] Writing ${fileName} [${bar}] ${pct}% (${e.bytesWritten}/${e.totalBytes})`);
39
- }
40
- else {
41
- console.log(`[CLI MOCK] Writing... (No totalBytes)`);
42
- }
43
- }
44
- },
45
- }, {
46
- runId: "verify_visual_run",
47
- startedAt: Date.now(),
48
- steps: 0,
49
- tools: 0,
50
- objectives: [],
51
- achieved: [],
52
- });
53
- const processor = new MarieToolProcessor(registry, tracker, async () => true, {
54
- spiritPressure: 100,
55
- toolHistory: [],
56
- techniqueExecutions: [],
57
- mood: "CAUTIOUS",
58
- errorHotspots: {},
59
- totalErrorCount: 0,
60
- victoryStreak: 0,
61
- }, cliFs);
62
- // Large content (>16KB to trigger chunking)
63
- const totalSize = 50000;
64
- const largeContent = "X".repeat(totalSize);
65
- const filePath = path.join(workingDir, "progress_bar_check.txt");
66
- console.log("Executing write_to_file with large content...");
67
- await processor.process({
68
- id: "call_visual",
69
- name: "write_to_file",
70
- input: { path: filePath, content: largeContent },
71
- });
72
- console.log(`Verification Results:`);
73
- const hasTotalBytes = eventLogs.every((e) => e.totalBytes === totalSize);
74
- console.log(`- All events have correct totalBytes (${totalSize}): ${hasTotalBytes ? "✅" : "❌"}`);
75
- if (!hasTotalBytes) {
76
- throw new Error("Events missing correct totalBytes!");
77
- }
78
- console.log("✅ Visual Progress Bar logic verified!");
79
- // Cleanup
80
- fs.rmSync(workingDir, { recursive: true, force: true });
81
- }
82
- verifyVisualProgressBar().catch((err) => {
83
- console.error("❌ Verification FAILED:", err);
84
- process.exit(1);
85
- });
86
- //# sourceMappingURL=VisualProgressTest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"VisualProgressTest.js","sourceRoot":"","sources":["../../../src/monolith/tests/VisualProgressTest.ts"],"names":[],"mappings":"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"}