@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.
- package/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +2 -2
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +5 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +10 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +9 -12
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
- package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
- package/analyzer-template/packages/aws/package.json +1 -1
- package/analyzer-template/packages/database/package.json +1 -1
- package/analyzer-template/packages/database/src/lib/loadAnalysis.ts +19 -15
- package/analyzer-template/packages/database/src/lib/loadEntity.ts +19 -8
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadAnalysis.js.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +5 -5
- package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +22 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +27 -0
- package/analyzer-template/project/analyzeFileEntities.ts +26 -0
- package/background/src/lib/virtualized/project/analyzeFileEntities.js +22 -0
- package/background/src/lib/virtualized/project/analyzeFileEntities.js.map +1 -1
- package/codeyam-cli/src/cli.js +15 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/commands/__tests__/editor.stepDispatch.test.js +9 -9
- package/codeyam-cli/src/commands/editor.js +981 -344
- package/codeyam-cli/src/commands/editor.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +1 -0
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +1274 -33
- package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js +137 -0
- package/codeyam-cli/src/utils/__tests__/editorCaptureScenarioSeeding.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js +66 -0
- package/codeyam-cli/src/utils/__tests__/editorEntityHelpers.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js +67 -0
- package/codeyam-cli/src/utils/__tests__/editorGuardMiddleware.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js +70 -0
- package/codeyam-cli/src/utils/__tests__/editorScenarioSwitch.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js +71 -1
- package/codeyam-cli/src/utils/__tests__/editorScenarios.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js +233 -1
- package/codeyam-cli/src/utils/__tests__/entityChangeStatus.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js +177 -0
- package/codeyam-cli/src/utils/__tests__/glossaryAdd.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js +16 -1
- package/codeyam-cli/src/utils/__tests__/journalCaptureStabilization.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
- package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js +57 -0
- package/codeyam-cli/src/utils/__tests__/scenarioCoverage.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js +41 -0
- package/codeyam-cli/src/utils/__tests__/scenariosManifest.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js +84 -0
- package/codeyam-cli/src/utils/__tests__/screenshotHash.test.js.map +1 -0
- package/codeyam-cli/src/utils/analysisRunner.js +8 -6
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +8 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/editorAudit.js +277 -37
- package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
- package/codeyam-cli/src/utils/editorGuard.js +36 -0
- package/codeyam-cli/src/utils/editorGuard.js.map +1 -0
- package/codeyam-cli/src/utils/editorRecapture.js +109 -0
- package/codeyam-cli/src/utils/editorRecapture.js.map +1 -0
- package/codeyam-cli/src/utils/editorScenarioSwitch.js +24 -2
- package/codeyam-cli/src/utils/editorScenarioSwitch.js.map +1 -1
- package/codeyam-cli/src/utils/editorScenarios.js +65 -6
- package/codeyam-cli/src/utils/editorScenarios.js.map +1 -1
- package/codeyam-cli/src/utils/entityChangeStatus.js +31 -3
- package/codeyam-cli/src/utils/entityChangeStatus.js.map +1 -1
- package/codeyam-cli/src/utils/glossaryAdd.js +74 -0
- package/codeyam-cli/src/utils/glossaryAdd.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +5 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +6 -3
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
- package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
- package/codeyam-cli/src/utils/scenarioCoverage.js +4 -1
- package/codeyam-cli/src/utils/scenarioCoverage.js.map +1 -1
- package/codeyam-cli/src/utils/scenariosManifest.js +28 -0
- package/codeyam-cli/src/utils/scenariosManifest.js.map +1 -1
- package/codeyam-cli/src/utils/screenshotHash.js +26 -0
- package/codeyam-cli/src/utils/screenshotHash.js.map +1 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js +9 -0
- package/codeyam-cli/src/utils/simulationGateMiddleware.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js +68 -1
- package/codeyam-cli/src/webserver/__tests__/clientErrors.test.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js +123 -21
- package/codeyam-cli/src/webserver/__tests__/idleDetector.test.js.map +1 -1
- package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js +135 -0
- package/codeyam-cli/src/webserver/__tests__/stripClaudeCommand.test.js.map +1 -0
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js +22 -1
- package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-recapture-stale-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-CJzc4vOH.svg} +2 -2
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DODLxLcw.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-Dx-h1rJK.js +130 -0
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-NTuLi4Xg.js +41 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-CUobbQdQ.js → entity._sha.scenarios._scenarioId.dev-BA5L8bU-.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-C6eeL24i.js → entity._sha.scenarios._scenarioId.fullscreen-D4dmRgvO.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/globals-BrPXT1iR.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/manifest-5025e428.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{root-DB3O9_9j.js → root-BCx1S8Z3.js} +26 -13
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-C1kjC9UJ.js +13 -0
- package/codeyam-cli/src/webserver/build/server/assets/{index-CEaDhUiv.js → index-C91yWWCI.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/{init-DA7guOrE.js → init-Dkas-RUS.js} +2 -2
- package/codeyam-cli/src/webserver/build/server/assets/server-build-pulXLTrG.js +640 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/idleDetector.js +41 -8
- package/codeyam-cli/src/webserver/idleDetector.js.map +1 -1
- package/codeyam-cli/src/webserver/scripts/journalCapture.ts +53 -0
- package/codeyam-cli/src/webserver/server.js +52 -14
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/src/webserver/terminalServer.js +141 -27
- package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
- package/codeyam-cli/templates/__tests__/editor-step-hook.prompt-capture.test.ts +118 -0
- package/codeyam-cli/templates/codeyam-editor-claude.md +2 -0
- package/codeyam-cli/templates/codeyam-editor-reference.md +214 -0
- package/codeyam-cli/templates/editor-step-hook.py +93 -46
- package/codeyam-cli/templates/skills/codeyam-editor/SKILL.md +19 -1
- package/package.json +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +4 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +3 -2
- package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +9 -7
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
- package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
- package/packages/database/src/lib/loadAnalysis.js +1 -1
- package/packages/database/src/lib/loadAnalysis.js.map +1 -1
- package/packages/database/src/lib/loadEntity.js +5 -5
- package/packages/database/src/lib/loadEntity.js.map +1 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js +22 -1
- package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-B7xQ9Sjy.js +0 -58
- package/codeyam-cli/src/webserver/build/client/assets/editorPreview-CxmrE6AF.js +0 -41
- package/codeyam-cli/src/webserver/build/client/assets/globals-fAqOD9ex.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-5d53342d.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/analysisRunner-DcJSnBCE.js +0 -13
- 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(
|
|
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(
|
|
136
|
+
detector.onPtyOutput('ab');
|
|
136
137
|
jest.advanceTimersByTime(500);
|
|
137
138
|
detector.onUserInput();
|
|
138
|
-
detector.onPtyOutput(
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AACvC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAEtC,SAAS,cAAc,CAAC,
|
|
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]
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAU7B
|
|
1
|
+
{"version":3,"file":"clientErrors.js","sourceRoot":"","sources":["../../../../../../src/webserver/app/lib/clientErrors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -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="#
|
|
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="#
|
|
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};
|