@codeyam/codeyam-cli 0.1.0-staging.25a2014 → 0.1.0-staging.26dc674

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 (154) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +2 -2
  4. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +5 -1
  5. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +10 -6
  6. package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
  7. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  8. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  9. package/analyzer-template/packages/aws/package.json +1 -1
  10. package/analyzer-template/packages/database/package.json +1 -1
  11. package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +19 -15
  12. package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
  13. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
  14. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +1 -1
  15. package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
  16. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  17. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  18. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
  19. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  20. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  21. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  22. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +22 -1
  23. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  24. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +27 -0
  25. package/analyzer-template/project/analyzeFileEntities.ts +26 -0
  26. package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
  27. package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
  28. package/codeyam-cli/src/cli.js +15 -0
  29. package/codeyam-cli/src/cli.js.map +1 -1
  30. package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +9 -9
  31. package/codeyam-cli/src/commands/editor.js +981 -344
  32. package/codeyam-cli/src/commands/editor.js.map +1 -1
  33. package/codeyam-cli/src/commands/init.js +1 -0
  34. package/codeyam-cli/src/commands/init.js.map +1 -1
  35. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +1274 -33
  36. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  37. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
  38. package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
  39. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +66 -0
  40. package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -1
  41. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
  42. package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
  43. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +70 -0
  44. package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -1
  45. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +71 -1
  46. package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
  47. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +233 -1
  48. package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
  49. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
  50. package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
  51. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +16 -1
  52. package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -1
  53. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  54. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  55. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +57 -0
  56. package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -1
  57. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +41 -0
  58. package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -1
  59. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
  60. package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
  61. package/codeyam-cli/src/utils/analysisRunner.js +8 -6
  62. package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
  63. package/codeyam-cli/src/utils/analyzer.js +8 -0
  64. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  65. package/codeyam-cli/src/utils/editorAudit.js +277 -37
  66. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  67. package/codeyam-cli/src/utils/editorGuard.js +36 -0
  68. package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
  69. package/codeyam-cli/src/utils/editorRecapture.js +109 -0
  70. package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
  71. package/codeyam-cli/src/utils/editorScenarioSwitch.js +24 -2
  72. package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -1
  73. package/codeyam-cli/src/utils/editorScenarios.js +65 -6
  74. package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
  75. package/codeyam-cli/src/utils/entityChangeStatus.js +31 -3
  76. package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -1
  77. package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
  78. package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
  79. package/codeyam-cli/src/utils/install-skills.js +5 -0
  80. package/codeyam-cli/src/utils/install-skills.js.map +1 -1
  81. package/codeyam-cli/src/utils/queue/job.js +6 -3
  82. package/codeyam-cli/src/utils/queue/job.js.map +1 -1
  83. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  84. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  85. package/codeyam-cli/src/utils/scenarioCoverage.js +4 -1
  86. package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -1
  87. package/codeyam-cli/src/utils/scenariosManifest.js +28 -0
  88. package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -1
  89. package/codeyam-cli/src/utils/screenshotHash.js +26 -0
  90. package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
  91. package/codeyam-cli/src/utils/simulationGateMiddleware.js +9 -0
  92. package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
  93. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +68 -1
  94. package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -1
  95. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +123 -21
  96. package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -1
  97. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
  98. package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
  99. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +22 -1
  100. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -1
  101. package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
  102. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  103. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  104. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-CJzc4vOH.svg} +2 -2
  105. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DODLxLcw.js +1 -0
  106. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-Dx-h1rJK.js +130 -0
  107. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-NTuLi4Xg.js +41 -0
  108. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-CUobbQdQ.js → entity._sha.scenarios._scenarioId.dev-BA5L8bU-.js} +1 -1
  109. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-C6eeL24i.js → entity._sha.scenarios._scenarioId.fullscreen-D4dmRgvO.js} +1 -1
  110. package/codeyam-cli/src/webserver/build/client/assets/globals-BrPXT1iR.css +1 -0
  111. package/codeyam-cli/src/webserver/build/client/assets/manifest-5025e428.js +1 -0
  112. package/codeyam-cli/src/webserver/build/client/assets/{root-DB3O9_9j.js → root-BCx1S8Z3.js} +26 -13
  113. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-C1kjC9UJ.js +13 -0
  114. package/codeyam-cli/src/webserver/build/server/assets/{index-CEaDhUiv.js → index-C91yWWCI.js} +1 -1
  115. package/codeyam-cli/src/webserver/build/server/assets/{init-DA7guOrE.js → init-Dkas-RUS.js} +2 -2
  116. package/codeyam-cli/src/webserver/build/server/assets/server-build-pulXLTrG.js +640 -0
  117. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  118. package/codeyam-cli/src/webserver/build-info.json +5 -5
  119. package/codeyam-cli/src/webserver/idleDetector.js +41 -8
  120. package/codeyam-cli/src/webserver/idleDetector.js.map +1 -1
  121. package/codeyam-cli/src/webserver/scripts/journalCapture.ts +53 -0
  122. package/codeyam-cli/src/webserver/server.js +52 -14
  123. package/codeyam-cli/src/webserver/server.js.map +1 -1
  124. package/codeyam-cli/src/webserver/terminalServer.js +141 -27
  125. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  126. package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
  127. package/codeyam-cli/templates/codeyam-editor-claude.md +2 -0
  128. package/codeyam-cli/templates/codeyam-editor-reference.md +214 -0
  129. package/codeyam-cli/templates/editor-step-hook.py +93 -46
  130. package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +19 -1
  131. package/package.json +1 -1
  132. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +4 -1
  133. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  134. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +3 -2
  135. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  136. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
  137. package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
  138. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  139. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  140. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  141. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  142. package/packages/database/src/lib/loadAnalysis.js +1 -1
  143. package/packages/database/src/lib/loadAnalysis.js.map +1 -1
  144. package/packages/database/src/lib/loadEntity.js +5 -5
  145. package/packages/database/src/lib/loadEntity.js.map +1 -1
  146. package/packages/utils/src/lib/fs/rsyncCopy.js +22 -1
  147. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  148. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  149. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-B7xQ9Sjy.js +0 -58
  150. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CxmrE6AF.js +0 -41
  151. package/codeyam-cli/src/webserver/build/client/assets/globals-fAqOD9ex.css +0 -1
  152. package/codeyam-cli/src/webserver/build/client/assets/manifest-5d53342d.js +0 -1
  153. package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-DcJSnBCE.js +0 -13
  154. package/codeyam-cli/src/webserver/build/server/assets/server-build-juyiY2m6.js +0 -551
@@ -8,13 +8,14 @@ function createDetector(opts) {
8
8
  idleTimeoutMs: opts?.idleTimeoutMs ?? 3000,
9
9
  typingCooldownMs: opts?.typingCooldownMs ?? 2000,
10
10
  minOutputForReidle: opts?.minOutputForReidle ?? 100,
11
+ activeOutputPattern: opts?.activeOutputPattern,
11
12
  });
12
13
  return { detector, onIdle, onActive };
13
14
  }
14
15
  describe('IdleDetector', () => {
15
16
  it('signals idle after output stops for the timeout duration', () => {
16
17
  const { detector, onIdle } = createDetector();
17
- detector.onPtyOutput(500);
18
+ detector.onPtyOutput('x'.repeat(500));
18
19
  expect(onIdle).not.toHaveBeenCalled();
19
20
  jest.advanceTimersByTime(3000);
20
21
  expect(onIdle).toHaveBeenCalledTimes(1);
@@ -22,16 +23,16 @@ describe('IdleDetector', () => {
22
23
  });
23
24
  it('does not signal idle before timeout elapses', () => {
24
25
  const { detector, onIdle } = createDetector();
25
- detector.onPtyOutput(500);
26
+ detector.onPtyOutput('x'.repeat(500));
26
27
  jest.advanceTimersByTime(2999);
27
28
  expect(onIdle).not.toHaveBeenCalled();
28
29
  detector.dispose();
29
30
  });
30
31
  it('resets the timer on each new output chunk', () => {
31
32
  const { detector, onIdle } = createDetector();
32
- detector.onPtyOutput(100);
33
+ detector.onPtyOutput('x'.repeat(100));
33
34
  jest.advanceTimersByTime(2000);
34
- detector.onPtyOutput(100);
35
+ detector.onPtyOutput('x'.repeat(100));
35
36
  jest.advanceTimersByTime(2000);
36
37
  expect(onIdle).not.toHaveBeenCalled();
37
38
  jest.advanceTimersByTime(1000);
@@ -40,7 +41,7 @@ describe('IdleDetector', () => {
40
41
  });
41
42
  it('suppresses idle timer during user typing', () => {
42
43
  const { detector, onIdle } = createDetector();
43
- detector.onPtyOutput(500);
44
+ detector.onPtyOutput('x'.repeat(500));
44
45
  jest.advanceTimersByTime(1000);
45
46
  // User starts typing
46
47
  detector.onUserInput();
@@ -50,12 +51,12 @@ describe('IdleDetector', () => {
50
51
  });
51
52
  it('resumes idle detection after typing cooldown expires', () => {
52
53
  const { detector, onIdle } = createDetector();
53
- detector.onPtyOutput(500);
54
+ detector.onPtyOutput('x'.repeat(500));
54
55
  detector.onUserInput();
55
56
  jest.advanceTimersByTime(5000);
56
57
  expect(onIdle).not.toHaveBeenCalled();
57
58
  // Typing cooldown expired (2s), now new output arrives
58
- detector.onPtyOutput(500);
59
+ detector.onPtyOutput('x'.repeat(500));
59
60
  jest.advanceTimersByTime(3000);
60
61
  expect(onIdle).toHaveBeenCalledTimes(1);
61
62
  detector.dispose();
@@ -64,7 +65,7 @@ describe('IdleDetector', () => {
64
65
  const { detector, onIdle } = createDetector();
65
66
  detector.onUserInput();
66
67
  // PTY echoes the keystroke
67
- detector.onPtyOutput(1);
68
+ detector.onPtyOutput('a');
68
69
  jest.advanceTimersByTime(5000);
69
70
  expect(onIdle).not.toHaveBeenCalled();
70
71
  detector.dispose();
@@ -72,11 +73,11 @@ describe('IdleDetector', () => {
72
73
  it('does not re-signal idle without sufficient new output', () => {
73
74
  const { detector, onIdle } = createDetector();
74
75
  // First idle
75
- detector.onPtyOutput(500);
76
+ detector.onPtyOutput('x'.repeat(500));
76
77
  jest.advanceTimersByTime(3000);
77
78
  expect(onIdle).toHaveBeenCalledTimes(1);
78
79
  // Small output (< 100 bytes) — should NOT trigger re-idle
79
- detector.onPtyOutput(10);
80
+ detector.onPtyOutput('x'.repeat(10));
80
81
  jest.advanceTimersByTime(5000);
81
82
  expect(onIdle).toHaveBeenCalledTimes(1);
82
83
  detector.dispose();
@@ -84,12 +85,12 @@ describe('IdleDetector', () => {
84
85
  it('signals active then re-idles after substantial new output', () => {
85
86
  const { detector, onIdle, onActive } = createDetector();
86
87
  // First idle
87
- detector.onPtyOutput(500);
88
+ detector.onPtyOutput('x'.repeat(500));
88
89
  jest.advanceTimersByTime(3000);
89
90
  expect(onIdle).toHaveBeenCalledTimes(1);
90
91
  expect(onActive).not.toHaveBeenCalled();
91
92
  // Claude produces a real response (>= 100 bytes)
92
- detector.onPtyOutput(200);
93
+ detector.onPtyOutput('x'.repeat(200));
93
94
  expect(onActive).toHaveBeenCalledTimes(1);
94
95
  // Goes idle again
95
96
  jest.advanceTimersByTime(3000);
@@ -99,13 +100,13 @@ describe('IdleDetector', () => {
99
100
  it('accumulates small output chunks toward the re-idle threshold', () => {
100
101
  const { detector, onIdle, onActive } = createDetector();
101
102
  // First idle
102
- detector.onPtyOutput(500);
103
+ detector.onPtyOutput('x'.repeat(500));
103
104
  jest.advanceTimersByTime(3000);
104
105
  expect(onIdle).toHaveBeenCalledTimes(1);
105
106
  // Several small chunks that together exceed the threshold
106
- detector.onPtyOutput(40);
107
- detector.onPtyOutput(40);
108
- detector.onPtyOutput(40); // total = 120, exceeds 100
107
+ detector.onPtyOutput('x'.repeat(40));
108
+ detector.onPtyOutput('x'.repeat(40));
109
+ detector.onPtyOutput('x'.repeat(40)); // total = 120, exceeds 100
109
110
  expect(onActive).toHaveBeenCalledTimes(1);
110
111
  jest.advanceTimersByTime(3000);
111
112
  expect(onIdle).toHaveBeenCalledTimes(2);
@@ -114,16 +115,16 @@ describe('IdleDetector', () => {
114
115
  it('reports isIdle correctly', () => {
115
116
  const { detector } = createDetector();
116
117
  expect(detector.isIdle).toBe(false);
117
- detector.onPtyOutput(500);
118
+ detector.onPtyOutput('x'.repeat(500));
118
119
  jest.advanceTimersByTime(3000);
119
120
  expect(detector.isIdle).toBe(true);
120
- detector.onPtyOutput(200);
121
+ detector.onPtyOutput('x'.repeat(200));
121
122
  expect(detector.isIdle).toBe(false);
122
123
  detector.dispose();
123
124
  });
124
125
  it('cleans up timers on dispose', () => {
125
126
  const { detector, onIdle } = createDetector();
126
- detector.onPtyOutput(500);
127
+ detector.onPtyOutput('x'.repeat(500));
127
128
  detector.dispose();
128
129
  jest.advanceTimersByTime(5000);
129
130
  expect(onIdle).not.toHaveBeenCalled();
@@ -132,10 +133,10 @@ describe('IdleDetector', () => {
132
133
  const { detector, onIdle } = createDetector();
133
134
  // Simulate: user types, PTY echoes, user types more
134
135
  detector.onUserInput();
135
- detector.onPtyOutput(2);
136
+ detector.onPtyOutput('ab');
136
137
  jest.advanceTimersByTime(500);
137
138
  detector.onUserInput();
138
- detector.onPtyOutput(2);
139
+ detector.onPtyOutput('cd');
139
140
  jest.advanceTimersByTime(500);
140
141
  detector.onUserInput();
141
142
  jest.advanceTimersByTime(5000);
@@ -143,4 +144,105 @@ describe('IdleDetector', () => {
143
144
  detector.dispose();
144
145
  });
145
146
  });
147
+ describe('IdleDetector activeOutputPattern', () => {
148
+ it('suppresses idle when last output matches active pattern (thinking ✶)', () => {
149
+ const { detector, onIdle } = createDetector({
150
+ activeOutputPattern: /[✶✢]/,
151
+ });
152
+ // Status line with ✶ is the last output
153
+ detector.onPtyOutput('\r\x1b[K✶ Cascading… (16m 56s · ↓ 15.6k tokens)');
154
+ jest.advanceTimersByTime(3000);
155
+ // Should NOT signal idle — pattern matched, timer restarted
156
+ expect(onIdle).not.toHaveBeenCalled();
157
+ detector.dispose();
158
+ });
159
+ it('suppresses idle when last output matches active pattern (task ✢)', () => {
160
+ const { detector, onIdle } = createDetector({
161
+ activeOutputPattern: /[✶✢]/,
162
+ });
163
+ // Task status line with ✢
164
+ detector.onPtyOutput('\r\x1b[K✢ Accomplishing… (8m 50s · ↓ 15.8k tokens)');
165
+ jest.advanceTimersByTime(3000);
166
+ // Should NOT signal idle — pattern matched, timer restarted
167
+ expect(onIdle).not.toHaveBeenCalled();
168
+ detector.dispose();
169
+ });
170
+ it('suppresses idle during task progress with · indicator', () => {
171
+ const { detector, onIdle } = createDetector({
172
+ activeOutputPattern: /[✶✢·◼]/,
173
+ });
174
+ // Task progress line — Claude is working on a task
175
+ detector.onPtyOutput('\r\x1b[K· Building CUJ 0: Extension Install & Welcome… (12m 44s · ↓ 19.1k tokens)');
176
+ jest.advanceTimersByTime(3000);
177
+ expect(onIdle).not.toHaveBeenCalled();
178
+ detector.dispose();
179
+ });
180
+ it('suppresses idle during running task with ◼ indicator', () => {
181
+ const { detector, onIdle } = createDetector({
182
+ activeOutputPattern: /[✶✢·◼]/,
183
+ });
184
+ // Running task line
185
+ detector.onPtyOutput(' ⎿ ◼ Use `codeyam editor` to work on CUJ 0');
186
+ jest.advanceTimersByTime(3000);
187
+ expect(onIdle).not.toHaveBeenCalled();
188
+ detector.dispose();
189
+ });
190
+ it('signals idle normally when last output does not match pattern', () => {
191
+ const { detector, onIdle } = createDetector({
192
+ activeOutputPattern: /[✶✢·◼]/,
193
+ });
194
+ // Normal prompt output (no active indicators)
195
+ detector.onPtyOutput('$ ');
196
+ jest.advanceTimersByTime(3000);
197
+ expect(onIdle).toHaveBeenCalledTimes(1);
198
+ detector.dispose();
199
+ });
200
+ it('after suppression, eventually signals idle when pattern disappears', () => {
201
+ const { detector, onIdle } = createDetector({
202
+ activeOutputPattern: /[✶✢]/,
203
+ });
204
+ // Status line with ✶
205
+ detector.onPtyOutput('✶ Working…');
206
+ jest.advanceTimersByTime(3000);
207
+ expect(onIdle).not.toHaveBeenCalled(); // suppressed
208
+ // Status line clears, prompt appears
209
+ detector.onPtyOutput('\r\n$ ');
210
+ jest.advanceTimersByTime(3000);
211
+ expect(onIdle).toHaveBeenCalledTimes(1);
212
+ detector.dispose();
213
+ });
214
+ it('updates lastLine correctly across multiple chunks with \\r rewrites', () => {
215
+ const { detector, onIdle } = createDetector({
216
+ activeOutputPattern: /[✶✢]/,
217
+ });
218
+ // Ink-style rewrite: partial content, then \r + full line
219
+ detector.onPtyOutput('✶ Step 1');
220
+ jest.advanceTimersByTime(1000);
221
+ // Carriage return rewrites the line — old content discarded
222
+ detector.onPtyOutput('\r$ done');
223
+ jest.advanceTimersByTime(3000);
224
+ // ✶ is no longer in the last line — should signal idle
225
+ expect(onIdle).toHaveBeenCalledTimes(1);
226
+ detector.dispose();
227
+ });
228
+ it('caps lastLine buffer to prevent unbounded growth', () => {
229
+ const { detector, onIdle } = createDetector({
230
+ activeOutputPattern: /[✶✢]/,
231
+ });
232
+ // Send a very long line
233
+ detector.onPtyOutput('x'.repeat(1000));
234
+ jest.advanceTimersByTime(3000);
235
+ // No pattern match — should signal idle normally
236
+ expect(onIdle).toHaveBeenCalledTimes(1);
237
+ detector.dispose();
238
+ });
239
+ it('works without activeOutputPattern (backward compatible)', () => {
240
+ const { detector, onIdle } = createDetector();
241
+ detector.onPtyOutput('✶ Working…');
242
+ jest.advanceTimersByTime(3000);
243
+ // No pattern configured — idle should fire normally
244
+ expect(onIdle).toHaveBeenCalledTimes(1);
245
+ detector.dispose();
246
+ });
247
+ });
146
248
  //# sourceMappingURL=idleDetector.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"idleDetector.test.js","sourceRoot":"","sources":["../../../../../src/webserver/__tests__/idleDetector.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idleDetector.test.js","sourceRoot":"","sources":["../../../../../src/webserver/__tests__/idleDetector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import { stripClaudeCommand, StartupOutputFilter, shouldFilterStartup, isBannerChunk, } from "../terminalServer.js";
2
+ describe('stripClaudeCommand', () => {
3
+ test('strips claude --session-id command with prompt prefix', () => {
4
+ const input = "$ claude --session-id 'abc-123' '/codeyam-editor'\r\nsome output\r\n";
5
+ expect(stripClaudeCommand(input)).toBe('some output\r\n');
6
+ });
7
+ test('strips claude --resume command', () => {
8
+ const input = "claude --resume 'abc-123' 'The session was interrupted.'\r\noutput\r\n";
9
+ expect(stripClaudeCommand(input)).toBe('output\r\n');
10
+ });
11
+ test('strips claude --continue command', () => {
12
+ const input = "claude --continue 'The session was interrupted.'\r\noutput\r\n";
13
+ expect(stripClaudeCommand(input)).toBe('output\r\n');
14
+ });
15
+ test('strips claude with skill argument (no flags)', () => {
16
+ const input = "claude '/codeyam-dev-mode'\r\noutput\r\n";
17
+ expect(stripClaudeCommand(input)).toBe('output\r\n');
18
+ });
19
+ test('strips command with shell prompt prefix', () => {
20
+ const input = "user@host % claude --session-id 'x' '/codeyam-editor'\r\noutput\r\n";
21
+ expect(stripClaudeCommand(input)).toBe('output\r\n');
22
+ });
23
+ test('preserves output when no claude command present', () => {
24
+ const input = 'some other output\r\n';
25
+ expect(stripClaudeCommand(input)).toBe('some other output\r\n');
26
+ });
27
+ test('returns empty string when only the command is present', () => {
28
+ const input = "claude --session-id 'abc' '/codeyam-editor'\r\n";
29
+ expect(stripClaudeCommand(input)).toBe('');
30
+ });
31
+ });
32
+ describe('StartupOutputFilter', () => {
33
+ test('suppresses output before ╭ banner arrives', () => {
34
+ const filter = new StartupOutputFilter();
35
+ const result = filter.processChunk('$ claude --session-id ...\r\n');
36
+ expect(result.type).toBe('suppress');
37
+ });
38
+ test('clears and sends when ╭ banner arrives in its own chunk', () => {
39
+ const filter = new StartupOutputFilter();
40
+ filter.processChunk('$ claude --session-id ...\r\n');
41
+ const result = filter.processChunk('╭─── Claude Code ───╮\r\n');
42
+ expect(result.type).toBe('clear-and-send');
43
+ expect(result.data).toBe('╭─── Claude Code ───╮\r\n');
44
+ });
45
+ test('strips command when command and ╭ banner arrive in the same chunk', () => {
46
+ const filter = new StartupOutputFilter();
47
+ // This is the bug: PTY batches command echo + banner into one chunk
48
+ const combined = "$ claude --session-id 'abc-123' '/codeyam-editor'\r\n╭─── Claude Code ───╮\r\n";
49
+ const result = filter.processChunk(combined);
50
+ expect(result.type).toBe('clear-and-send');
51
+ // The command line must be stripped — only the banner should remain
52
+ expect(result.data).toBe('╭─── Claude Code ───╮\r\n');
53
+ });
54
+ test('clears and sends when new block-art banner arrives (no ╭)', () => {
55
+ const filter = new StartupOutputFilter();
56
+ filter.processChunk('$ claude --session-id ...\r\n');
57
+ const result = filter.processChunk(' ▐▛███▜▌ Claude Code v2.1.80\r\n');
58
+ expect(result.type).toBe('clear-and-send');
59
+ expect(result.data).toBe(' ▐▛███▜▌ Claude Code v2.1.80\r\n');
60
+ });
61
+ test('strips command when command and new block-art banner arrive in the same chunk', () => {
62
+ const filter = new StartupOutputFilter();
63
+ const combined = "user@host % claude --session-id 'abc-123' '/codeyam-editor'\r\n ▐▛███▜▌ Claude Code v2.1.80\r\n";
64
+ const result = filter.processChunk(combined);
65
+ expect(result.type).toBe('clear-and-send');
66
+ expect(result.data).toBe(' ▐▛███▜▌ Claude Code v2.1.80\r\n');
67
+ });
68
+ test('passes through output after screen has been cleared', () => {
69
+ const filter = new StartupOutputFilter();
70
+ filter.processChunk('╭─── Claude Code ───╮\r\n');
71
+ const result = filter.processChunk('normal output');
72
+ expect(result.type).toBe('send');
73
+ expect(result.data).toBe('normal output');
74
+ });
75
+ describe('getTimeoutOutput', () => {
76
+ test('returns stripped buffered output when ╭ never arrives', () => {
77
+ const filter = new StartupOutputFilter();
78
+ filter.processChunk("$ claude --session-id 'abc' '/codeyam-editor'\r\nsome early output\r\n");
79
+ const output = filter.getTimeoutOutput();
80
+ expect(output).toBe('some early output\r\n');
81
+ });
82
+ test('returns null if screen was already cleared', () => {
83
+ const filter = new StartupOutputFilter();
84
+ filter.processChunk('╭─── Claude Code ───╮\r\n');
85
+ expect(filter.getTimeoutOutput()).toBeNull();
86
+ });
87
+ test('returns null if no output was buffered', () => {
88
+ const filter = new StartupOutputFilter();
89
+ expect(filter.getTimeoutOutput()).toBeNull();
90
+ });
91
+ test('timeout strips shell prompt + command arriving as separate chunks', () => {
92
+ const filter = new StartupOutputFilter();
93
+ // zsh outputs prompt first, then command echo as a separate chunk
94
+ filter.processChunk('user@host myproject % ');
95
+ filter.processChunk("claude --session-id 'abc-123' '/codeyam-editor'\r\n");
96
+ // Only the command and prompt — nothing real to show
97
+ expect(filter.getTimeoutOutput()).toBeNull();
98
+ });
99
+ test('timeout strips ANSI-laden zsh prompt + command but preserves trailing output', () => {
100
+ const filter = new StartupOutputFilter();
101
+ filter.processChunk('\x1b[?2004h\x1b[1m\x1b[36muser@host\x1b[0m testapp \x1b[33m%\x1b[0m ');
102
+ filter.processChunk("claude --session-id 'abc' '/codeyam-editor'\r\n\x1b[?2004l");
103
+ filter.processChunk('real output after command\r\n');
104
+ const output = filter.getTimeoutOutput();
105
+ expect(output).toBe('real output after command\r\n');
106
+ });
107
+ test('timeout strips everything before and including the claude command line', () => {
108
+ const filter = new StartupOutputFilter();
109
+ filter.processChunk("user@host % \r\x1b[Kclaude --session-id 'x' '/codeyam-editor'\r\n" +
110
+ '\x1b[?2004l\x1b[?1h' +
111
+ 'some real output\r\n');
112
+ const output = filter.getTimeoutOutput();
113
+ expect(output).toBe('some real output\r\n');
114
+ });
115
+ });
116
+ });
117
+ describe('shouldFilterStartup', () => {
118
+ test('filters when hasContext is true', () => {
119
+ expect(shouldFilterStartup({ hasContext: true, editorMode: false })).toBe(true);
120
+ });
121
+ test('filters in editor mode even when hasContext is false', () => {
122
+ expect(shouldFilterStartup({ hasContext: false, editorMode: true })).toBe(true);
123
+ });
124
+ test('does not filter when neither hasContext nor editorMode', () => {
125
+ expect(shouldFilterStartup({ hasContext: false, editorMode: false })).toBe(false);
126
+ });
127
+ });
128
+ describe('isBannerChunk', () => {
129
+ test('detects banner when ANSI color codes separate ▐ and ▛', () => {
130
+ // Real Claude Code output: ▐ and ▛ are separated by ANSI SGR sequences
131
+ const chunk = '\x1b[38;5;174m ▐\x1b[48;5;16m▛███▜\x1b[49m▌\x1b[3C\x1b[39m\x1b[1mClaude Code';
132
+ expect(isBannerChunk(chunk)).toBe(true);
133
+ });
134
+ });
135
+ //# sourceMappingURL=stripClaudeCommand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripClaudeCommand.test.js","sourceRoot":"","sources":["../../../../../src/webserver/__tests__/stripClaudeCommand.test.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,22 @@ import * as path from 'path';
3
3
  /**
4
4
  * Parse client-side errors from journalCapture.ts stdout.
5
5
  * Extracts console.error and network failure lines.
6
+ *
7
+ * SYNC: The `[JournalCapture]` prefixes parsed here are hard-coded in
8
+ * journalCapture.ts — changes to either file must be mirrored in the other.
6
9
  */
7
10
  /** Network failure URLs that are internal infrastructure, not real client errors */
8
11
  const IGNORED_NETWORK_URLS = ['/api/health', '/__codeyam__/preview-health'];
9
12
  export function parseClientErrors(captureOutput) {
10
13
  const errors = [];
11
14
  for (const line of captureOutput.split('\n')) {
12
- if (line.includes('[JournalCapture] Page console.error:')) {
15
+ if (line.includes('[JournalCapture] HTTP error:')) {
16
+ errors.push(line.replace(/.*\[JournalCapture\] /, ''));
17
+ }
18
+ else if (line.includes('[JournalCapture] API response error:')) {
19
+ errors.push(line.replace(/.*\[JournalCapture\] /, ''));
20
+ }
21
+ else if (line.includes('[JournalCapture] Page console.error:')) {
13
22
  errors.push(line.replace(/.*\[JournalCapture\] Page console\.error:\s*/, ''));
14
23
  }
15
24
  else if (line.includes('[JournalCapture] Network failed:')) {
@@ -20,6 +29,18 @@ export function parseClientErrors(captureOutput) {
20
29
  }
21
30
  return errors;
22
31
  }
32
+ /**
33
+ * Parse visible text from journalCapture.ts stdout.
34
+ * Extracts the page's innerText captured after stabilization.
35
+ */
36
+ export function parseVisibleText(captureOutput) {
37
+ for (const line of captureOutput.split('\n')) {
38
+ if (line.includes('[JournalCapture] Visible text: ')) {
39
+ return line.replace(/.*\[JournalCapture\] Visible text: /, '');
40
+ }
41
+ }
42
+ return null;
43
+ }
23
44
  /**
24
45
  * Save client errors for a scenario to .codeyam/editor-scenarios/client-errors.json.
25
46
  * Accumulates errors per scenario (overwrites previous errors for the same scenario).
@@ -1 +1 @@
1
- {"version":3,"file":"clientErrors.js","sourceRoot":"","sources":["../../../../../../src/webserver/app/lib/clientErrors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clientErrors.js","sourceRoot":"","sources":["../../../../../../src/webserver/app/lib/clientErrors.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  <svg width="40" height="28" viewBox="0 0 40 28" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M12.0391 8.23173H14.5737C15.0795 8.23173 15.5645 8.03081 15.9221 7.6732C16.2797 7.31559 16.4806 6.83057 16.4806 6.32484C16.4806 5.8191 16.2797 5.33408 15.9221 4.97647C15.5645 4.61886 15.0795 4.41797 14.5737 4.41797H12.0477C11.5419 4.41797 11.0569 4.61886 10.6993 4.97647C10.3417 5.33408 10.1408 5.8191 10.1408 6.32484C10.1408 6.57525 10.0915 6.82323 9.99564 7.05458C9.89981 7.28594 9.75934 7.49613 9.58227 7.6732C9.4052 7.85027 9.19498 7.99074 8.96363 8.08657C8.73227 8.1824 8.48432 8.23173 8.2339 8.23173H5.70784C5.20285 8.23173 4.71847 8.43203 4.36099 8.78872C4.0035 9.14541 3.80208 9.62936 3.80095 10.1344C3.80095 10.6394 3.60065 11.1237 3.24396 11.4812C2.88727 11.8387 2.40335 12.0401 1.89835 12.0412C1.3941 12.0435 0.911246 12.2454 0.55548 12.6027C0.199714 12.9601 -5.04736e-06 13.4439 0 13.9481C-1.26644e-06 14.452 0.199853 14.9353 0.55574 15.2919C0.911627 15.6486 1.39449 15.8496 1.89835 15.8507C2.40335 15.8518 2.88727 16.0533 3.24396 16.4107C3.60065 16.7682 3.80095 17.2526 3.80095 17.7576C3.80095 18.2633 4.00187 18.7484 4.35948 19.106C4.71709 19.4636 5.20211 19.6645 5.70784 19.6645H8.2339C8.7389 19.6645 9.22328 19.8648 9.58076 20.2215C9.93825 20.5782 10.1396 21.0621 10.1408 21.5671C10.1408 22.0728 10.3417 22.5579 10.6993 22.9155C11.0569 23.2731 11.5419 23.474 12.0477 23.474H14.5737C14.8239 23.474 15.0717 23.4246 15.3028 23.3287C15.5339 23.2328 15.7439 23.0923 15.9206 22.9152C16.0973 22.7381 16.2374 22.5278 16.3327 22.2965C16.4281 22.0652 16.4769 21.8173 16.4764 21.5671C16.4764 21.0625 16.2759 20.5786 15.9191 20.2217C15.5623 19.8649 15.0783 19.6645 14.5737 19.6645H12.0434C11.5384 19.6633 11.0545 19.4619 10.6978 19.1045C10.3411 18.747 10.1408 18.2626 10.1408 17.7576C10.1408 17.2519 9.93988 16.7668 9.58227 16.4092C9.22466 16.0516 8.73964 15.8507 8.2339 15.8507H5.67798C5.17923 15.8508 4.7004 15.655 4.34456 15.3056C3.98871 14.9561 3.7843 14.4809 3.77536 13.9822C3.77536 13.9822 3.77536 13.9822 3.77536 13.9481C3.77536 13.9481 3.77536 13.9225 3.77536 13.9097C3.7843 13.411 3.98871 12.9358 4.34456 12.5864C4.7004 12.2369 5.17923 12.0411 5.67798 12.0412H8.2339C8.73964 12.0412 9.22466 11.8403 9.58227 11.4827C9.93988 11.1251 10.1408 10.6401 10.1408 10.1344C10.1408 9.63049 10.3407 9.14718 10.6965 8.79049C11.0524 8.4338 11.5353 8.23286 12.0391 8.23173Z" fill="#D7FF63"/>
3
- <path d="M37.4462 4.49533C36.9404 4.49533 36.4554 4.69622 36.0978 5.05383C35.7402 5.41143 35.5393 5.89646 35.5393 6.40219V10.2117C35.5393 10.4621 35.49 10.7101 35.3942 10.9414C35.2983 11.1728 35.1579 11.383 34.9808 11.5601C34.8037 11.7371 34.5935 11.8776 34.3622 11.9734C34.1308 12.0692 33.8828 12.1186 33.6324 12.1186C33.1274 12.1197 32.6435 12.3211 32.2868 12.6786C31.9301 13.0361 31.7298 13.5205 31.7298 14.0255C31.7287 14.5305 31.5273 15.0144 31.1698 15.3711C30.8123 15.7278 30.3279 15.9281 29.8229 15.9281C29.3179 15.9281 28.8336 15.7278 28.4761 15.3711C28.1186 15.0144 27.9172 14.5305 27.9161 14.0255C27.9161 13.5205 27.7157 13.0361 27.359 12.6786C27.0024 12.3211 26.5184 12.1197 26.0134 12.1186C25.763 12.1186 25.5151 12.0692 25.2837 11.9734C25.0524 11.8776 24.8421 11.7371 24.6651 11.5601C24.488 11.383 24.3475 11.1728 24.2517 10.9414C24.1559 10.7101 24.1065 10.4621 24.1065 10.2117V6.415C24.1187 6.15729 24.0785 5.89977 23.9883 5.65805C23.8981 5.41633 23.7598 5.19543 23.5817 5.00873C23.4036 4.82203 23.1895 4.6734 22.9523 4.57185C22.7151 4.4703 22.4598 4.41797 22.2018 4.41797C21.9438 4.41797 21.6885 4.4703 21.4513 4.57185C21.2141 4.6734 21 4.82203 20.8219 5.00873C20.6439 5.19543 20.5055 5.41633 20.4153 5.65805C20.3251 5.89977 20.2849 6.15729 20.2971 6.415V10.2245C20.2971 10.7295 20.4974 11.2139 20.8541 11.5714C21.2108 11.9288 21.6947 12.1303 22.1997 12.1314C22.7054 12.1314 23.1904 12.3323 23.548 12.6899C23.9057 13.0475 24.1065 13.5325 24.1065 14.0383C24.1077 14.5433 24.3091 15.0272 24.6666 15.3839C25.0241 15.7406 25.5084 15.9409 26.0134 15.9409C26.5162 15.942 26.9982 16.1416 27.3545 16.4964C27.7109 16.8511 27.9127 17.3322 27.9161 17.835V21.6743C27.9161 22.1793 28.1164 22.6637 28.4731 23.0212C28.8297 23.3787 29.3137 23.5801 29.8187 23.5812C30.3244 23.5812 30.8094 23.3803 31.167 23.0227C31.5246 22.6651 31.7256 22.1801 31.7256 21.6743V17.8648C31.7256 17.3598 31.9259 16.8754 32.2825 16.5179C32.6392 16.1605 33.1232 15.9591 33.6281 15.9579C34.1331 15.9579 34.6175 15.7576 34.975 15.4009C35.3325 15.0443 35.5339 14.5603 35.535 14.0553C35.535 13.5496 35.7359 13.0646 36.0935 12.7069C36.4512 12.3493 36.9362 12.1484 37.4419 12.1484C37.9469 12.1473 38.4308 11.9459 38.7875 11.5884C39.1442 11.2309 39.3445 10.7465 39.3445 10.2415V6.415C39.3462 6.16423 39.2984 5.91558 39.2039 5.6833C39.1093 5.45103 38.9699 5.23969 38.7936 5.06138C38.6172 4.88306 38.4075 4.74129 38.1763 4.64415C37.9451 4.54702 37.697 4.49644 37.4462 4.49533Z" fill="#D7FF63"/>
2
+ <path d="M12.0391 8.23173H14.5737C15.0795 8.23173 15.5645 8.03081 15.9221 7.6732C16.2797 7.31559 16.4806 6.83057 16.4806 6.32484C16.4806 5.8191 16.2797 5.33408 15.9221 4.97647C15.5645 4.61886 15.0795 4.41797 14.5737 4.41797H12.0477C11.5419 4.41797 11.0569 4.61886 10.6993 4.97647C10.3417 5.33408 10.1408 5.8191 10.1408 6.32484C10.1408 6.57525 10.0915 6.82323 9.99564 7.05458C9.89981 7.28594 9.75934 7.49613 9.58227 7.6732C9.4052 7.85027 9.19498 7.99074 8.96363 8.08657C8.73227 8.1824 8.48432 8.23173 8.2339 8.23173H5.70784C5.20285 8.23173 4.71847 8.43203 4.36099 8.78872C4.0035 9.14541 3.80208 9.62936 3.80095 10.1344C3.80095 10.6394 3.60065 11.1237 3.24396 11.4812C2.88727 11.8387 2.40335 12.0401 1.89835 12.0412C1.3941 12.0435 0.911246 12.2454 0.55548 12.6027C0.199714 12.9601 -5.04736e-06 13.4439 0 13.9481C-1.26644e-06 14.452 0.199853 14.9353 0.55574 15.2919C0.911627 15.6486 1.39449 15.8496 1.89835 15.8507C2.40335 15.8518 2.88727 16.0533 3.24396 16.4107C3.60065 16.7682 3.80095 17.2526 3.80095 17.7576C3.80095 18.2633 4.00187 18.7484 4.35948 19.106C4.71709 19.4636 5.20211 19.6645 5.70784 19.6645H8.2339C8.7389 19.6645 9.22328 19.8648 9.58076 20.2215C9.93825 20.5782 10.1396 21.0621 10.1408 21.5671C10.1408 22.0728 10.3417 22.5579 10.6993 22.9155C11.0569 23.2731 11.5419 23.474 12.0477 23.474H14.5737C14.8239 23.474 15.0717 23.4246 15.3028 23.3287C15.5339 23.2328 15.7439 23.0923 15.9206 22.9152C16.0973 22.7381 16.2374 22.5278 16.3327 22.2965C16.4281 22.0652 16.4769 21.8173 16.4764 21.5671C16.4764 21.0625 16.2759 20.5786 15.9191 20.2217C15.5623 19.8649 15.0783 19.6645 14.5737 19.6645H12.0434C11.5384 19.6633 11.0545 19.4619 10.6978 19.1045C10.3411 18.747 10.1408 18.2626 10.1408 17.7576C10.1408 17.2519 9.93988 16.7668 9.58227 16.4092C9.22466 16.0516 8.73964 15.8507 8.2339 15.8507H5.67798C5.17923 15.8508 4.7004 15.655 4.34456 15.3056C3.98871 14.9561 3.7843 14.4809 3.77536 13.9822C3.77536 13.9822 3.77536 13.9822 3.77536 13.9481C3.77536 13.9481 3.77536 13.9225 3.77536 13.9097C3.7843 13.411 3.98871 12.9358 4.34456 12.5864C4.7004 12.2369 5.17923 12.0411 5.67798 12.0412H8.2339C8.73964 12.0412 9.22466 11.8403 9.58227 11.4827C9.93988 11.1251 10.1408 10.6401 10.1408 10.1344C10.1408 9.63049 10.3407 9.14718 10.6965 8.79049C11.0524 8.4338 11.5353 8.23286 12.0391 8.23173Z" fill="#6CCC93"/>
3
+ <path d="M37.4462 4.49533C36.9404 4.49533 36.4554 4.69622 36.0978 5.05383C35.7402 5.41143 35.5393 5.89646 35.5393 6.40219V10.2117C35.5393 10.4621 35.49 10.7101 35.3942 10.9414C35.2983 11.1728 35.1579 11.383 34.9808 11.5601C34.8037 11.7371 34.5935 11.8776 34.3622 11.9734C34.1308 12.0692 33.8828 12.1186 33.6324 12.1186C33.1274 12.1197 32.6435 12.3211 32.2868 12.6786C31.9301 13.0361 31.7298 13.5205 31.7298 14.0255C31.7287 14.5305 31.5273 15.0144 31.1698 15.3711C30.8123 15.7278 30.3279 15.9281 29.8229 15.9281C29.3179 15.9281 28.8336 15.7278 28.4761 15.3711C28.1186 15.0144 27.9172 14.5305 27.9161 14.0255C27.9161 13.5205 27.7157 13.0361 27.359 12.6786C27.0024 12.3211 26.5184 12.1197 26.0134 12.1186C25.763 12.1186 25.5151 12.0692 25.2837 11.9734C25.0524 11.8776 24.8421 11.7371 24.6651 11.5601C24.488 11.383 24.3475 11.1728 24.2517 10.9414C24.1559 10.7101 24.1065 10.4621 24.1065 10.2117V6.415C24.1187 6.15729 24.0785 5.89977 23.9883 5.65805C23.8981 5.41633 23.7598 5.19543 23.5817 5.00873C23.4036 4.82203 23.1895 4.6734 22.9523 4.57185C22.7151 4.4703 22.4598 4.41797 22.2018 4.41797C21.9438 4.41797 21.6885 4.4703 21.4513 4.57185C21.2141 4.6734 21 4.82203 20.8219 5.00873C20.6439 5.19543 20.5055 5.41633 20.4153 5.65805C20.3251 5.89977 20.2849 6.15729 20.2971 6.415V10.2245C20.2971 10.7295 20.4974 11.2139 20.8541 11.5714C21.2108 11.9288 21.6947 12.1303 22.1997 12.1314C22.7054 12.1314 23.1904 12.3323 23.548 12.6899C23.9057 13.0475 24.1065 13.5325 24.1065 14.0383C24.1077 14.5433 24.3091 15.0272 24.6666 15.3839C25.0241 15.7406 25.5084 15.9409 26.0134 15.9409C26.5162 15.942 26.9982 16.1416 27.3545 16.4964C27.7109 16.8511 27.9127 17.3322 27.9161 17.835V21.6743C27.9161 22.1793 28.1164 22.6637 28.4731 23.0212C28.8297 23.3787 29.3137 23.5801 29.8187 23.5812C30.3244 23.5812 30.8094 23.3803 31.167 23.0227C31.5246 22.6651 31.7256 22.1801 31.7256 21.6743V17.8648C31.7256 17.3598 31.9259 16.8754 32.2825 16.5179C32.6392 16.1605 33.1232 15.9591 33.6281 15.9579C34.1331 15.9579 34.6175 15.7576 34.975 15.4009C35.3325 15.0443 35.5339 14.5603 35.535 14.0553C35.535 13.5496 35.7359 13.0646 36.0935 12.7069C36.4512 12.3493 36.9362 12.1484 37.4419 12.1484C37.9469 12.1473 38.4308 11.9459 38.7875 11.5884C39.1442 11.2309 39.3445 10.7465 39.3445 10.2415V6.415C39.3462 6.16423 39.2984 5.91558 39.2039 5.6833C39.1093 5.45103 38.9699 5.23969 38.7936 5.06138C38.6172 4.88306 38.4075 4.74129 38.1763 4.64415C37.9451 4.54702 37.697 4.49644 37.4462 4.49533Z" fill="#6CCC93"/>
4
4
  </svg>
@@ -0,0 +1 @@
1
+ const c="/assets/cy-logo-cli-CJzc4vOH.svg";export{c};