@rewrlution/papyrus-cli 0.0.7 → 0.0.8
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/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/ai/index.d.ts +2 -0
- package/dist/commands/ai/index.js +13 -0
- package/dist/commands/ai/index.js.map +1 -0
- package/dist/commands/ai/standup.d.ts +2 -0
- package/dist/commands/ai/standup.js +23 -0
- package/dist/commands/ai/standup.js.map +1 -0
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/components/StandupStream.d.ts +5 -0
- package/dist/components/StandupStream.js +78 -0
- package/dist/components/StandupStream.js.map +1 -0
- package/dist/lib/api/index.d.ts +3 -0
- package/dist/lib/api/index.js +4 -1
- package/dist/lib/api/index.js.map +1 -1
- package/dist/lib/api/sse-client.d.ts +38 -0
- package/dist/lib/api/sse-client.js +112 -0
- package/dist/lib/api/sse-client.js.map +1 -0
- package/package.json +1 -1
- package/dist/utils/journal-preview.test.d.ts +0 -1
- package/dist/utils/journal-preview.test.js +0 -62
- package/dist/utils/journal-preview.test.js.map +0 -1
- package/dist/utils/text.test.d.ts +0 -1
- package/dist/utils/text.test.js +0 -47
- package/dist/utils/text.test.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
-
import { registerJournalCommands, registerAuthCommands, } from './commands/index.js';
|
|
3
|
+
import { registerJournalCommands, registerAuthCommands, registerAiCommands, } from './commands/index.js';
|
|
4
4
|
const program = new Command();
|
|
5
5
|
program
|
|
6
6
|
.name('papyrus')
|
|
@@ -8,5 +8,6 @@ program
|
|
|
8
8
|
.version('1.0.0');
|
|
9
9
|
registerAuthCommands(program);
|
|
10
10
|
registerJournalCommands(program);
|
|
11
|
+
registerAiCommands(program);
|
|
11
12
|
program.parse(process.argv);
|
|
12
13
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,uBAAuB,EACvB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,iCAAiC,CAAC;KAC9C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { generateStandup } from './standup.js';
|
|
2
|
+
export function registerAiCommands(program) {
|
|
3
|
+
program
|
|
4
|
+
.command('standup')
|
|
5
|
+
.description('Generate AI standup notes from journal entries')
|
|
6
|
+
.option('-d, --date <date>', 'Use journal from specific date (YYYYMMDD)')
|
|
7
|
+
.option('-f, --from <date>', 'Use journals from this date onwards (YYYYMMDD)')
|
|
8
|
+
.option('-t, --to <date>', 'Use journals up to this date (YYYYMMDD, requires --from)')
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
await generateStandup(options);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ai/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;SACxE,MAAM,CACL,mBAAmB,EACnB,gDAAgD,CACjD;SACA,MAAM,CACL,iBAAiB,EACjB,0DAA0D,CAC3D;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { render } from 'ink';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { StandupRequestSchema, } from '@rewrlution/papyrus-shared';
|
|
4
|
+
import { StandupStream } from '../../components/StandupStream.js';
|
|
5
|
+
import { ensureAuthenticated } from '../../lib/auth/require-auth.js';
|
|
6
|
+
import { error } from '../../utils/messages.js';
|
|
7
|
+
export async function generateStandup(options) {
|
|
8
|
+
ensureAuthenticated();
|
|
9
|
+
// Validate options using shared schema
|
|
10
|
+
const result = StandupRequestSchema.safeParse(options);
|
|
11
|
+
if (!result.success) {
|
|
12
|
+
error(result.error.issues[0].message);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const { waitUntilExit } = render(React.createElement(StandupStream, {
|
|
16
|
+
...result.data,
|
|
17
|
+
onComplete: () => {
|
|
18
|
+
// Component will call this when done
|
|
19
|
+
},
|
|
20
|
+
}));
|
|
21
|
+
await waitUntilExit();
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=standup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standup.js","sourceRoot":"","sources":["../../../src/commands/ai/standup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,oBAAoB,GAErB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAuB;IAC3D,mBAAmB,EAAE,CAAC;IAEtB,uCAAuC;IACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE;QACjC,GAAG,MAAM,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,EAAE;YACf,qCAAqC;QACvC,CAAC;KACF,CAAC,CACH,CAAC;IAEF,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC"}
|
package/dist/commands/index.d.ts
CHANGED
package/dist/commands/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { StandupRequest } from '@rewrlution/papyrus-shared';
|
|
2
|
+
export interface StandupStreamProps extends StandupRequest {
|
|
3
|
+
onComplete: () => void;
|
|
4
|
+
}
|
|
5
|
+
export declare function StandupStream({ date, from, to, onComplete, }: StandupStreamProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import { sse } from '../lib/api/index.js';
|
|
5
|
+
import { ColdStartAwareSpinner } from './ColdStart.js';
|
|
6
|
+
export function StandupStream({ date, from, to, onComplete, }) {
|
|
7
|
+
const [status, setStatus] = useState('thinking');
|
|
8
|
+
const [thinkingMessage, setThinkingMessage] = useState('');
|
|
9
|
+
const [content, setContent] = useState('');
|
|
10
|
+
const [journalDate, setJournalDate] = useState('');
|
|
11
|
+
const [usage, setUsage] = useState(null);
|
|
12
|
+
const [errorMessage, setErrorMessage] = useState('');
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
let isMounted = true;
|
|
15
|
+
const streamStandup = async () => {
|
|
16
|
+
try {
|
|
17
|
+
await sse.generateStandup({ date, from, to }, (event) => {
|
|
18
|
+
if (!isMounted)
|
|
19
|
+
return;
|
|
20
|
+
switch (event.type) {
|
|
21
|
+
case 'thinking':
|
|
22
|
+
setThinkingMessage(event.message);
|
|
23
|
+
setStatus('thinking');
|
|
24
|
+
break;
|
|
25
|
+
case 'content':
|
|
26
|
+
setStatus('streaming');
|
|
27
|
+
// Append new text chunk
|
|
28
|
+
setContent((prev) => prev + event.text);
|
|
29
|
+
break;
|
|
30
|
+
case 'done':
|
|
31
|
+
setStatus('done');
|
|
32
|
+
setJournalDate(event.journal_date);
|
|
33
|
+
setUsage(event.usage);
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
if (isMounted)
|
|
36
|
+
onComplete();
|
|
37
|
+
}, 100);
|
|
38
|
+
break;
|
|
39
|
+
case 'error':
|
|
40
|
+
setStatus('error');
|
|
41
|
+
setErrorMessage(event.message);
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
if (isMounted)
|
|
44
|
+
onComplete();
|
|
45
|
+
}, 2000);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (!isMounted)
|
|
52
|
+
return;
|
|
53
|
+
setStatus('error');
|
|
54
|
+
setErrorMessage(err instanceof Error ? err.message : 'An unexpected error occurred');
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
if (isMounted)
|
|
57
|
+
onComplete();
|
|
58
|
+
}, 2000);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
streamStandup();
|
|
62
|
+
return () => {
|
|
63
|
+
isMounted = false;
|
|
64
|
+
};
|
|
65
|
+
}, [date, from, to, onComplete]);
|
|
66
|
+
// Render based on status
|
|
67
|
+
if (status === 'thinking') {
|
|
68
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsx(ColdStartAwareSpinner, { message: thinkingMessage || 'Generating standup notes...' }) }));
|
|
69
|
+
}
|
|
70
|
+
if (status === 'error') {
|
|
71
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { color: "red", children: ["\u2717 Error: ", errorMessage] }) }));
|
|
72
|
+
}
|
|
73
|
+
if (status === 'streaming' || status === 'done') {
|
|
74
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { children: content }), status === 'done' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "green", children: "\u2713 Done!" }), usage && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Journal: ", journalDate, " \u2022", ' ', usage.tier === 'free' ? 'Free tier' : 'Premium', ' ', usage.used !== null && usage.limit !== null && (_jsxs(_Fragment, { children: ["(", usage.used, "/", usage.limit, " requests this month)"] }))] }) }))] }))] }));
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=StandupStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StandupStream.js","sourceRoot":"","sources":["../../src/components/StandupStream.tsx"],"names":[],"mappings":"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"}
|
package/dist/lib/api/index.d.ts
CHANGED
package/dist/lib/api/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ApiClient } from './api-client.js';
|
|
2
|
-
|
|
2
|
+
import { SseClient } from './sse-client.js';
|
|
3
|
+
const API_BASE_URL = 'https://papyrus-api.rewrlution.com/api';
|
|
3
4
|
export const api = new ApiClient(API_BASE_URL);
|
|
5
|
+
export const sse = new SseClient(API_BASE_URL);
|
|
4
6
|
export { ApiClient } from './api-client.js';
|
|
7
|
+
export { SseClient } from './sse-client.js';
|
|
5
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,YAAY,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAE9D,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type StandupStreamEvent, type StandupRequest } from '@rewrlution/papyrus-shared';
|
|
2
|
+
/**
|
|
3
|
+
* SSE Client for streaming endpoints.
|
|
4
|
+
*
|
|
5
|
+
* Handles Server-Sent Events (SSE) connections with authentication.
|
|
6
|
+
* Uses fetch API for streaming support (axios doesn't support SSE well).
|
|
7
|
+
*/
|
|
8
|
+
export declare class SseClient {
|
|
9
|
+
private baseUrl;
|
|
10
|
+
constructor(baseUrl: string);
|
|
11
|
+
/**
|
|
12
|
+
* Generate standup report from journals.
|
|
13
|
+
* Streams AI-generated content as SSE events.
|
|
14
|
+
*/
|
|
15
|
+
generateStandup(options: StandupRequest, onEvent: (event: StandupStreamEvent) => void): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Generic SSE streaming method.
|
|
18
|
+
* Handles connection, auth, and event parsing.
|
|
19
|
+
*/
|
|
20
|
+
private stream;
|
|
21
|
+
/**
|
|
22
|
+
* Make authenticated fetch request for SSE endpoint.
|
|
23
|
+
*/
|
|
24
|
+
private fetchWithAuth;
|
|
25
|
+
/**
|
|
26
|
+
* Parse SSE stream and emit typed events.
|
|
27
|
+
*
|
|
28
|
+
* SSE format:
|
|
29
|
+
* event: <type>\n
|
|
30
|
+
* data: <json>\n
|
|
31
|
+
* \n
|
|
32
|
+
*/
|
|
33
|
+
private parseSSEStream;
|
|
34
|
+
/**
|
|
35
|
+
* Parse and emit a single SSE event with Zod validation.
|
|
36
|
+
*/
|
|
37
|
+
private emitEvent;
|
|
38
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { StandupStreamEventSchema, } from '@rewrlution/papyrus-shared';
|
|
2
|
+
import { tokenStore } from '../storage/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* SSE Client for streaming endpoints.
|
|
5
|
+
*
|
|
6
|
+
* Handles Server-Sent Events (SSE) connections with authentication.
|
|
7
|
+
* Uses fetch API for streaming support (axios doesn't support SSE well).
|
|
8
|
+
*/
|
|
9
|
+
export class SseClient {
|
|
10
|
+
baseUrl;
|
|
11
|
+
constructor(baseUrl) {
|
|
12
|
+
this.baseUrl = baseUrl;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate standup report from journals.
|
|
16
|
+
* Streams AI-generated content as SSE events.
|
|
17
|
+
*/
|
|
18
|
+
async generateStandup(options, onEvent) {
|
|
19
|
+
return this.stream('/ai/standup', options, StandupStreamEventSchema, onEvent);
|
|
20
|
+
}
|
|
21
|
+
// --- Private infrastructure methods ---
|
|
22
|
+
/**
|
|
23
|
+
* Generic SSE streaming method.
|
|
24
|
+
* Handles connection, auth, and event parsing.
|
|
25
|
+
*/
|
|
26
|
+
async stream(endpoint, body, schema, onEvent) {
|
|
27
|
+
const response = await this.fetchWithAuth(endpoint, body);
|
|
28
|
+
await this.parseSSEStream(response, schema, onEvent);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Make authenticated fetch request for SSE endpoint.
|
|
32
|
+
*/
|
|
33
|
+
async fetchWithAuth(endpoint, body) {
|
|
34
|
+
const token = tokenStore.get();
|
|
35
|
+
if (!token) {
|
|
36
|
+
throw new Error('Not authenticated');
|
|
37
|
+
}
|
|
38
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
39
|
+
const response = await fetch(url, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: {
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
Authorization: `Bearer ${token}`,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
49
|
+
}
|
|
50
|
+
if (!response.body) {
|
|
51
|
+
throw new Error('No response body');
|
|
52
|
+
}
|
|
53
|
+
return response;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse SSE stream and emit typed events.
|
|
57
|
+
*
|
|
58
|
+
* SSE format:
|
|
59
|
+
* event: <type>\n
|
|
60
|
+
* data: <json>\n
|
|
61
|
+
* \n
|
|
62
|
+
*/
|
|
63
|
+
async parseSSEStream(response, schema, onEvent) {
|
|
64
|
+
const reader = response.body.getReader();
|
|
65
|
+
const decoder = new TextDecoder();
|
|
66
|
+
let buffer = '';
|
|
67
|
+
try {
|
|
68
|
+
while (true) {
|
|
69
|
+
const { done, value } = await reader.read();
|
|
70
|
+
if (done)
|
|
71
|
+
break;
|
|
72
|
+
buffer += decoder.decode(value, { stream: true });
|
|
73
|
+
// Process complete SSE messages (split by newlines)
|
|
74
|
+
const lines = buffer.split('\n');
|
|
75
|
+
buffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
76
|
+
let currentEvent = '';
|
|
77
|
+
let currentData = '';
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
if (line.startsWith('event: ')) {
|
|
80
|
+
currentEvent = line.slice(7);
|
|
81
|
+
}
|
|
82
|
+
else if (line.startsWith('data: ')) {
|
|
83
|
+
currentData = line.slice(6);
|
|
84
|
+
}
|
|
85
|
+
else if (line === '' && currentEvent && currentData) {
|
|
86
|
+
// Empty line = end of message, emit event
|
|
87
|
+
this.emitEvent(currentEvent, currentData, schema, onEvent);
|
|
88
|
+
currentEvent = '';
|
|
89
|
+
currentData = '';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
reader.releaseLock();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Parse and emit a single SSE event with Zod validation.
|
|
100
|
+
*/
|
|
101
|
+
emitEvent(eventType, jsonData, schema, onEvent) {
|
|
102
|
+
try {
|
|
103
|
+
const data = JSON.parse(jsonData);
|
|
104
|
+
const event = schema.parse({ type: eventType, ...data });
|
|
105
|
+
onEvent(event);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
console.error('Failed to parse SSE event:', eventType, jsonData);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=sse-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../../../src/lib/api/sse-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { extractPreview } from './journal-preview.js';
|
|
3
|
-
describe('extractPreview', () => {
|
|
4
|
-
it('should extract first line after frontmatter', () => {
|
|
5
|
-
const content = `---
|
|
6
|
-
created_at: "2025-01-01T00:00:00Z"
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
This is the first line
|
|
10
|
-
This is the second line`;
|
|
11
|
-
expect(extractPreview(content)).toBe('This is the first line');
|
|
12
|
-
});
|
|
13
|
-
it('should skip empty lines after frontmatter', () => {
|
|
14
|
-
const content = `---
|
|
15
|
-
created_at: "2025-01-01T00:00:00Z"
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
This is the first line`;
|
|
21
|
-
expect(extractPreview(content)).toBe('This is the first line');
|
|
22
|
-
});
|
|
23
|
-
it('should work with content without frontmatter', () => {
|
|
24
|
-
const content = `This is the first line
|
|
25
|
-
This is the second line`;
|
|
26
|
-
expect(extractPreview(content)).toBe('This is the first line');
|
|
27
|
-
});
|
|
28
|
-
it('should return "(empty)" for empty content', () => {
|
|
29
|
-
expect(extractPreview('')).toBe('(empty)');
|
|
30
|
-
});
|
|
31
|
-
it('should return "(empty)" for content with only frontmatter', () => {
|
|
32
|
-
const content = `---
|
|
33
|
-
created_at: "2025-01-01T00:00:00Z"
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
`;
|
|
37
|
-
expect(extractPreview(content)).toBe('(empty)');
|
|
38
|
-
});
|
|
39
|
-
it('should return "(empty)" for content with only whitespace', () => {
|
|
40
|
-
const content = `
|
|
41
|
-
|
|
42
|
-
`;
|
|
43
|
-
expect(extractPreview(content)).toBe('(empty)');
|
|
44
|
-
});
|
|
45
|
-
it('should handle CJK characters', () => {
|
|
46
|
-
const content = `---
|
|
47
|
-
created_at: "2025-01-01T00:00:00Z"
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
今日はとても良い天気でした`;
|
|
51
|
-
expect(extractPreview(content)).toBe('今日はとても良い天気でした');
|
|
52
|
-
});
|
|
53
|
-
it('should handle emoji', () => {
|
|
54
|
-
const content = `---
|
|
55
|
-
created_at: "2025-01-01T00:00:00Z"
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
🎉 Today was a great day!`;
|
|
59
|
-
expect(extractPreview(content)).toBe('🎉 Today was a great day!');
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
//# sourceMappingURL=journal-preview.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"journal-preview.test.js","sourceRoot":"","sources":["../../src/utils/journal-preview.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG;;;;;wBAKI,CAAC;QAErB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,OAAO,GAAG;;;;;;uBAMG,CAAC;QAEpB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG;wBACI,CAAC;QAErB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,OAAO,GAAG;;;;CAInB,CAAC;QAEE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,OAAO,GAAG;;KAEf,CAAC;QAEF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,OAAO,GAAG;;;;cAIN,CAAC;QAEX,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,OAAO,GAAG;;;;0BAIM,CAAC;QAEvB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/utils/text.test.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { truncateToWidth, padToWidth } from './text.js';
|
|
3
|
-
describe('truncateToWidth', () => {
|
|
4
|
-
it('should return text as-is when it fits', () => {
|
|
5
|
-
expect(truncateToWidth('Hello', 10)).toBe('Hello');
|
|
6
|
-
});
|
|
7
|
-
it('should truncate text with ellipsis when too long', () => {
|
|
8
|
-
expect(truncateToWidth('Hello World', 8)).toBe('Hello W…');
|
|
9
|
-
});
|
|
10
|
-
it('should handle empty string', () => {
|
|
11
|
-
expect(truncateToWidth('', 5)).toBe('');
|
|
12
|
-
});
|
|
13
|
-
it('should handle zero maxWidth', () => {
|
|
14
|
-
expect(truncateToWidth('Hello', 0)).toBe('');
|
|
15
|
-
});
|
|
16
|
-
it('should handle CJK characters (wide chars)', () => {
|
|
17
|
-
// 你好 = 2 chars × 2 columns = 4 columns
|
|
18
|
-
expect(truncateToWidth('你好世界', 5)).toBe('你好…');
|
|
19
|
-
});
|
|
20
|
-
it('should handle emoji (wide chars)', () => {
|
|
21
|
-
// 👋 = 2 columns, space = 1, 'He' = 2, ellipsis = 1 → total 6
|
|
22
|
-
expect(truncateToWidth('👋 Hello', 6)).toBe('👋 He…');
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
describe('padToWidth', () => {
|
|
26
|
-
it('should pad text with spaces to reach target width', () => {
|
|
27
|
-
expect(padToWidth('Hello', 10)).toBe('Hello ');
|
|
28
|
-
});
|
|
29
|
-
it('should return text as-is when already at target width', () => {
|
|
30
|
-
expect(padToWidth('Hello', 5)).toBe('Hello');
|
|
31
|
-
});
|
|
32
|
-
it('should truncate text when too long', () => {
|
|
33
|
-
expect(padToWidth('Hello World', 8)).toBe('Hello W…');
|
|
34
|
-
});
|
|
35
|
-
it('should handle empty string', () => {
|
|
36
|
-
expect(padToWidth('', 5)).toBe(' ');
|
|
37
|
-
});
|
|
38
|
-
it('should handle CJK characters (wide chars)', () => {
|
|
39
|
-
// 你好 = 2 chars × 2 columns = 4 columns, need 2 more spaces to reach 6
|
|
40
|
-
expect(padToWidth('你好', 6)).toBe('你好 ');
|
|
41
|
-
});
|
|
42
|
-
it('should handle emoji (wide chars)', () => {
|
|
43
|
-
// 👋 = 2 columns, need 3 more spaces to reach 5
|
|
44
|
-
expect(padToWidth('👋', 5)).toBe('👋 ');
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
//# sourceMappingURL=text.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text.test.js","sourceRoot":"","sources":["../../src/utils/text.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,uCAAuC;QACvC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,8DAA8D;QAC9D,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,sEAAsE;QACtE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,gDAAgD;QAChD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|