markdown-markdown 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/AGENT.md +12 -0
  2. package/dist/cli.js +0 -0
  3. package/dist/server/host.d.ts +20 -0
  4. package/dist/server/host.d.ts.map +1 -0
  5. package/dist/server/host.js +190 -0
  6. package/dist/server/host.js.map +1 -0
  7. package/dist/server/runtime.d.ts +2 -2
  8. package/dist/server/runtime.d.ts.map +1 -1
  9. package/dist/server/runtime.js +13 -61
  10. package/dist/server/runtime.js.map +1 -1
  11. package/dist/server/session-store.d.ts +15 -0
  12. package/dist/server/session-store.d.ts.map +1 -0
  13. package/dist/server/session-store.js +151 -0
  14. package/dist/server/session-store.js.map +1 -0
  15. package/dist/types.d.ts +29 -1
  16. package/dist/types.d.ts.map +1 -1
  17. package/dist/web/assets/{_baseUniq-DWSAgCYE.js → _baseUniq-nFqJWqJf.js} +1 -1
  18. package/dist/web/assets/{arc-BLgyBygL.js → arc-Jg9CFoKt.js} +1 -1
  19. package/dist/web/assets/{architectureDiagram-Q4EWVU46-WgZ5UMvM.js → architectureDiagram-Q4EWVU46-DYR5Lm08.js} +1 -1
  20. package/dist/web/assets/{blockDiagram-DXYQGD6D-CLfiyr9S.js → blockDiagram-DXYQGD6D-30J7_LoM.js} +1 -1
  21. package/dist/web/assets/{c4Diagram-AHTNJAMY-DetWrVzN.js → c4Diagram-AHTNJAMY-BClBvNDA.js} +1 -1
  22. package/dist/web/assets/channel-B-PozOMc.js +1 -0
  23. package/dist/web/assets/{chunk-4BX2VUAB-CwFW4HRp.js → chunk-4BX2VUAB-Bgzv4fI5.js} +1 -1
  24. package/dist/web/assets/{chunk-4TB4RGXK-jdkxDJTI.js → chunk-4TB4RGXK-BKN4Lng_.js} +1 -1
  25. package/dist/web/assets/{chunk-55IACEB6-LHLQ9Mhr.js → chunk-55IACEB6-CXq43BG4.js} +1 -1
  26. package/dist/web/assets/{chunk-EDXVE4YY-gXBG7iiV.js → chunk-EDXVE4YY-DokDvDhv.js} +1 -1
  27. package/dist/web/assets/{chunk-FMBD7UC4-D0c2ufl0.js → chunk-FMBD7UC4-BNN1454L.js} +1 -1
  28. package/dist/web/assets/{chunk-OYMX7WX6-Cam5t0AC.js → chunk-OYMX7WX6-CMHPjdY3.js} +1 -1
  29. package/dist/web/assets/{chunk-QZHKN3VN-VDTy7PR1.js → chunk-QZHKN3VN-D9Xdgwdu.js} +1 -1
  30. package/dist/web/assets/{chunk-YZCP3GAM-DDQlY4hF.js → chunk-YZCP3GAM-CNVT9piY.js} +1 -1
  31. package/dist/web/assets/classDiagram-6PBFFD2Q-DZU9TAgg.js +1 -0
  32. package/dist/web/assets/classDiagram-v2-HSJHXN6E-DZU9TAgg.js +1 -0
  33. package/dist/web/assets/clone-BUwPWatq.js +1 -0
  34. package/dist/web/assets/{cose-bilkent-S5V4N54A-CydpJVOO.js → cose-bilkent-S5V4N54A-Bhn6pAUV.js} +1 -1
  35. package/dist/web/assets/{dagre-KV5264BT-DfWRqVQs.js → dagre-KV5264BT-C4y39Usr.js} +1 -1
  36. package/dist/web/assets/{diagram-5BDNPKRD-DYocjsGb.js → diagram-5BDNPKRD-rlvQhIY0.js} +1 -1
  37. package/dist/web/assets/{diagram-G4DWMVQ6-BwxP9kS5.js → diagram-G4DWMVQ6-CxlsuhBt.js} +1 -1
  38. package/dist/web/assets/{diagram-MMDJMWI5-BmV1mUfz.js → diagram-MMDJMWI5-aO59UQJW.js} +1 -1
  39. package/dist/web/assets/{diagram-TYMM5635-DMUZyCDV.js → diagram-TYMM5635-DboqCGxD.js} +1 -1
  40. package/dist/web/assets/{erDiagram-SMLLAGMA-CDgJ2VS3.js → erDiagram-SMLLAGMA-BfTNK70Y.js} +1 -1
  41. package/dist/web/assets/{flowDiagram-DWJPFMVM-aLxzOWpe.js → flowDiagram-DWJPFMVM-D5GqUELM.js} +1 -1
  42. package/dist/web/assets/{ganttDiagram-T4ZO3ILL-ct-v0U4O.js → ganttDiagram-T4ZO3ILL-0oluOY8-.js} +1 -1
  43. package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-DJ-FLYU_.js → gitGraphDiagram-UUTBAWPF-DOvCDomy.js} +1 -1
  44. package/dist/web/assets/{graph-DUCnU9ms.js → graph-D6tF7y1b.js} +1 -1
  45. package/dist/web/assets/index-4xbK2CF5.css +1 -0
  46. package/dist/web/assets/{index-D7013kRO.js → index-CLPXS5Pa.js} +140 -140
  47. package/dist/web/assets/{infoDiagram-42DDH7IO-DmMBz9mk.js → infoDiagram-42DDH7IO-DzqzFgrP.js} +1 -1
  48. package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-D-dfZT_7.js → ishikawaDiagram-UXIWVN3A-WJU0OO5B.js} +1 -1
  49. package/dist/web/assets/{journeyDiagram-VCZTEJTY-DCLyO8ny.js → journeyDiagram-VCZTEJTY-Bo7zyWBb.js} +1 -1
  50. package/dist/web/assets/{kanban-definition-6JOO6SKY-DaSer7-n.js → kanban-definition-6JOO6SKY-DqDWBbmi.js} +1 -1
  51. package/dist/web/assets/{layout-BaZRT940.js → layout-eCIhMhgM.js} +1 -1
  52. package/dist/web/assets/{linear-CH1vCRmv.js → linear-DhP7p6ZM.js} +1 -1
  53. package/dist/web/assets/{min-C200fz71.js → min-CmgCLj3n.js} +1 -1
  54. package/dist/web/assets/{mindmap-definition-QFDTVHPH-CCqZjE9I.js → mindmap-definition-QFDTVHPH-B7bz994e.js} +1 -1
  55. package/dist/web/assets/{pieDiagram-DEJITSTG-Beh4XRu6.js → pieDiagram-DEJITSTG-DlKyyMAM.js} +1 -1
  56. package/dist/web/assets/{quadrantDiagram-34T5L4WZ-DOPc33qF.js → quadrantDiagram-34T5L4WZ-B3C_LSAl.js} +1 -1
  57. package/dist/web/assets/{requirementDiagram-MS252O5E-DwblBLZK.js → requirementDiagram-MS252O5E-D7q7Uv1-.js} +1 -1
  58. package/dist/web/assets/{sankeyDiagram-XADWPNL6-DlMTDWAl.js → sankeyDiagram-XADWPNL6-B3AHI7j9.js} +1 -1
  59. package/dist/web/assets/{sequenceDiagram-FGHM5R23-CPvNK8NS.js → sequenceDiagram-FGHM5R23-C0ym1rK1.js} +1 -1
  60. package/dist/web/assets/{stateDiagram-FHFEXIEX-C51anF0K.js → stateDiagram-FHFEXIEX-_NYky71o.js} +1 -1
  61. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BMjcTPNs.js +1 -0
  62. package/dist/web/assets/{timeline-definition-GMOUNBTQ-B0M6txNM.js → timeline-definition-GMOUNBTQ-BPub2z2y.js} +1 -1
  63. package/dist/web/assets/{vennDiagram-DHZGUBPP-DuNg6iKA.js → vennDiagram-DHZGUBPP-B1ao3Y4V.js} +1 -1
  64. package/dist/web/assets/{wardley-RL74JXVD-CnLmvQxW.js → wardley-RL74JXVD-xqk6dIJX.js} +1 -1
  65. package/dist/web/assets/{wardleyDiagram-NUSXRM2D-DVMWnQbQ.js → wardleyDiagram-NUSXRM2D-DHkUBrSw.js} +1 -1
  66. package/dist/web/assets/{xychartDiagram-5P7HB3ND-Cec8luZO.js → xychartDiagram-5P7HB3ND-D62ziF_o.js} +1 -1
  67. package/dist/web/index.html +2 -2
  68. package/package.json +2 -4
  69. package/dist/web/assets/channel-B52zE7C-.js +0 -1
  70. package/dist/web/assets/classDiagram-6PBFFD2Q-Bn5mNtvt.js +0 -1
  71. package/dist/web/assets/classDiagram-v2-HSJHXN6E-Bn5mNtvt.js +0 -1
  72. package/dist/web/assets/clone-CWdO33LD.js +0 -1
  73. package/dist/web/assets/index-Lxs7QZQJ.css +0 -1
  74. package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-DgIcCuV2.js +0 -1
package/AGENT.md CHANGED
@@ -24,6 +24,18 @@ For agent-facing usage guidance, use the separate [`markdown-markdown-skill`](ht
24
24
  - Run the test suite with `npm test`.
25
25
  - Publish releases through GitHub Actions on `v*` tags; avoid local `npm publish` except for bootstrap or debugging.
26
26
 
27
+ ## Release Workflow
28
+
29
+ - Treat `main` as the source of truth.
30
+ - Make sure `npm run lint`, `npm test`, and `npm run build` pass before tagging a release.
31
+ - Bump the package version with `npm version patch`, `npm version minor`, or `npm version major` as appropriate.
32
+ - Let `npm version` create the release commit and `vX.Y.Z` tag, or create the tag explicitly if you need more control.
33
+ - Push the release commit and tag together with `git push origin main --tags`.
34
+ - The GitHub Actions workflow `Publish npm package` runs on `v*` tags and publishes with npm trusted publishing via OIDC.
35
+ - Do not reintroduce `NPM_TOKEN` or token-based publish steps unless we intentionally fall back from trusted publishing.
36
+ - If the publish job fails, check that the package version matches the tag, the workflow file name still matches the npm trusted publisher configuration, and the repository URL in `package.json` still points at this repo.
37
+ - Use `workflow_dispatch` only for a manual rerun or debugging; the normal release path is tag push.
38
+
27
39
  ## Environment
28
40
 
29
41
  - Set `GEMINI_API_KEY` in `.env.local` before running features that depend on Gemini.
package/dist/cli.js CHANGED
File without changes
@@ -0,0 +1,20 @@
1
+ import type { MarkdownFile, ReviewAbandonedResult, ReviewResult } from '../types.js';
2
+ import { type SessionStoreOptions } from './session-store.js';
3
+ export interface ReviewHostOptions extends SessionStoreOptions {
4
+ rootPath: string;
5
+ mode: 'file' | 'directory';
6
+ files: MarkdownFile[];
7
+ sessionId?: string;
8
+ staticDir: string;
9
+ }
10
+ export interface ReviewHostHandle {
11
+ close: () => Promise<void>;
12
+ notifyBrowserClosed: (reason?: string) => Promise<ReviewAbandonedResult | null>;
13
+ port: number;
14
+ result: Promise<ReviewResult>;
15
+ sessionId: string;
16
+ stateRoot: string;
17
+ url: string;
18
+ }
19
+ export declare function startReviewHost({ rootPath, mode, files, sessionId, staticDir, ...storeOptions }: ReviewHostOptions): Promise<ReviewHostHandle>;
20
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/server/host.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,YAAY,EAIb,MAAM,aAAa,CAAC;AACrB,OAAO,EAQL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,mBAAmB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AA0BD,wBAAsB,eAAe,CAAC,EACpC,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,EACT,SAAS,EACT,GAAG,YAAY,EAChB,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgM/C"}
@@ -0,0 +1,190 @@
1
+ import express from 'express';
2
+ import { createServer } from 'node:http';
3
+ import path from 'node:path';
4
+ import { buildReviewPrompt } from '../lib/review.js';
5
+ import { closeSession, createSession, getActiveSession, incrementSessionRound, readSessionResult, setSessionPhase, writeSessionResult, } from './session-store.js';
6
+ import { discoverMarkdownFiles } from './session.js';
7
+ function listen(server) {
8
+ return new Promise((resolve, reject) => {
9
+ server.once('error', reject);
10
+ server.listen(0, '127.0.0.1', () => {
11
+ const address = server.address();
12
+ if (typeof address === 'object' && address) {
13
+ resolve(address.port);
14
+ return;
15
+ }
16
+ reject(new Error('Unable to determine review server port.'));
17
+ });
18
+ });
19
+ }
20
+ async function loadHostedSession(options, sessionId) {
21
+ const activeSession = await getActiveSession(options);
22
+ if (!activeSession || activeSession.sessionId !== sessionId) {
23
+ throw new Error(`Active review session ${sessionId} was not found.`);
24
+ }
25
+ return activeSession;
26
+ }
27
+ export async function startReviewHost({ rootPath, mode, files, sessionId, staticDir, ...storeOptions }) {
28
+ const app = express();
29
+ app.use(express.json({ limit: '2mb' }));
30
+ const session = await createSession({
31
+ annotations: [],
32
+ files,
33
+ mode,
34
+ phase: 'waiting_for_review',
35
+ rootPath,
36
+ round: 1,
37
+ sessionId,
38
+ }, storeOptions);
39
+ let latestResult = await readSessionResult(session.sessionId, storeOptions);
40
+ let resolvedResult = false;
41
+ let resolveResult = () => { };
42
+ const result = new Promise((resolve) => {
43
+ resolveResult = resolve;
44
+ });
45
+ const resolveOnce = (value) => {
46
+ if (resolvedResult) {
47
+ return;
48
+ }
49
+ resolvedResult = true;
50
+ resolveResult(value);
51
+ };
52
+ const buildAbandonedResult = async (reason) => {
53
+ const current = await loadHostedSession(storeOptions, session.sessionId);
54
+ if (latestResult || current.phase === 'abandoned' || current.phase === 'completed') {
55
+ if (latestResult && 'reason' in latestResult) {
56
+ return latestResult;
57
+ }
58
+ return null;
59
+ }
60
+ const updated = await setSessionPhase(session.sessionId, 'abandoned', storeOptions, {
61
+ abandonedReason: reason,
62
+ });
63
+ const abandonedAt = new Date().toISOString();
64
+ const abandonedResult = {
65
+ ...updated,
66
+ abandonedAt,
67
+ phase: 'abandoned',
68
+ reason,
69
+ round: updated.round,
70
+ };
71
+ latestResult = await writeSessionResult(session.sessionId, abandonedResult, storeOptions);
72
+ resolveOnce(abandonedResult);
73
+ return abandonedResult;
74
+ };
75
+ app.get('/api/session', async (_request, response) => {
76
+ try {
77
+ const current = await loadHostedSession(storeOptions, session.sessionId);
78
+ response.json(current);
79
+ }
80
+ catch (error) {
81
+ response.status(404).json({ error: error instanceof Error ? error.message : 'Review session not found.' });
82
+ }
83
+ });
84
+ app.post('/api/submit', async (request, response) => {
85
+ try {
86
+ if (latestResult?.phase === 'completed') {
87
+ response.json(latestResult);
88
+ return;
89
+ }
90
+ const current = await loadHostedSession(storeOptions, session.sessionId);
91
+ const body = request.body;
92
+ const action = body?.action ?? 'finish_review';
93
+ const annotations = Array.isArray(body?.annotations) ? body.annotations : [];
94
+ const submittedAt = new Date().toISOString();
95
+ const prompt = buildReviewPrompt({ rootPath, files: current.files, annotations });
96
+ const submittedPhase = action === 'finish_review' ? 'submitted_finish' : 'submitted_continue';
97
+ const finalPhase = action === 'finish_review' ? 'completed' : 'awaiting_refresh';
98
+ await setSessionPhase(session.sessionId, submittedPhase, storeOptions, {
99
+ action,
100
+ annotations,
101
+ submittedAt,
102
+ });
103
+ const persisted = await setSessionPhase(session.sessionId, finalPhase, storeOptions, {
104
+ action,
105
+ annotations,
106
+ submittedAt,
107
+ });
108
+ const reviewResult = {
109
+ ...persisted,
110
+ action,
111
+ annotations,
112
+ prompt,
113
+ round: persisted.round,
114
+ submittedAt,
115
+ };
116
+ latestResult = await writeSessionResult(session.sessionId, reviewResult, storeOptions);
117
+ resolveOnce(reviewResult);
118
+ response.json(reviewResult);
119
+ }
120
+ catch (error) {
121
+ response.status(500).json({ error: error instanceof Error ? error.message : 'Failed to submit review session.' });
122
+ }
123
+ });
124
+ app.post('/api/abandon', async (request, response) => {
125
+ const reason = typeof request.body?.reason === 'string' && request.body.reason.trim().length > 0
126
+ ? request.body.reason
127
+ : 'browser_closed_by_user';
128
+ try {
129
+ const abandoned = await buildAbandonedResult(reason);
130
+ response.json(abandoned);
131
+ }
132
+ catch (error) {
133
+ response.status(500).json({ error: error instanceof Error ? error.message : 'Failed to abandon review session.' });
134
+ }
135
+ });
136
+ app.get('/api/control/status', async (_request, response) => {
137
+ try {
138
+ const current = await loadHostedSession(storeOptions, session.sessionId);
139
+ response.json(current);
140
+ }
141
+ catch (error) {
142
+ response.status(404).json({ error: error instanceof Error ? error.message : 'Review session not found.' });
143
+ }
144
+ });
145
+ app.get('/api/control/result', async (_request, response) => {
146
+ latestResult = await readSessionResult(session.sessionId, storeOptions);
147
+ response.json(latestResult);
148
+ });
149
+ app.post('/api/control/refresh', async (_request, response) => {
150
+ try {
151
+ const refreshedFiles = await discoverMarkdownFiles(rootPath);
152
+ latestResult = await writeSessionResult(session.sessionId, null, storeOptions);
153
+ const nextRound = await incrementSessionRound(session.sessionId, {
154
+ annotations: [],
155
+ files: refreshedFiles,
156
+ phase: 'waiting_for_review',
157
+ }, storeOptions);
158
+ response.json(nextRound);
159
+ }
160
+ catch (error) {
161
+ response.status(500).json({ error: error instanceof Error ? error.message : 'Failed to refresh review session.' });
162
+ }
163
+ });
164
+ app.post('/api/control/close', async (_request, response) => {
165
+ await closeSession(session.sessionId, storeOptions);
166
+ response.json({ closed: true, sessionId: session.sessionId });
167
+ });
168
+ app.use(express.static(staticDir));
169
+ app.get('*', (_request, response) => {
170
+ response.sendFile(path.join(staticDir, 'index.html'));
171
+ });
172
+ const server = createServer(app);
173
+ const port = await listen(server);
174
+ const url = `http://127.0.0.1:${port}`;
175
+ return {
176
+ close: async () => {
177
+ await closeSession(session.sessionId, storeOptions);
178
+ await new Promise((resolve) => {
179
+ server.close(() => resolve());
180
+ });
181
+ },
182
+ notifyBrowserClosed: async (reason = 'browser_closed_by_user') => buildAbandonedResult(reason),
183
+ port,
184
+ result,
185
+ sessionId: session.sessionId,
186
+ stateRoot: storeOptions.stateRoot ?? '',
187
+ url,
188
+ };
189
+ }
190
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/server/host.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,10 @@ export interface ReviewRuntimeOptions {
6
6
  staticDir: string;
7
7
  }
8
8
  export interface ReviewRuntimeHandle {
9
+ close: () => Promise<void>;
9
10
  port: number;
10
- url: string;
11
11
  result: Promise<ReviewSubmissionResult>;
12
- close: () => Promise<void>;
12
+ url: string;
13
13
  }
14
14
  export declare function startReviewRuntime({ rootPath, mode, files, staticDir, }: ReviewRuntimeOptions): Promise<ReviewRuntimeHandle>;
15
15
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/server/runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAGZ,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAiBD,wBAAsB,kBAAkB,CAAC,EACvC,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8DrD"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/server/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGxE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,kBAAkB,CAAC,EACvC,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoBrD"}
@@ -1,69 +1,21 @@
1
- import express from 'express';
2
- import { createServer } from 'node:http';
3
- import path from 'node:path';
4
- import { buildReviewPrompt } from '../lib/review.js';
5
- function listen(server) {
6
- return new Promise((resolve, reject) => {
7
- server.once('error', reject);
8
- server.listen(0, '127.0.0.1', () => {
9
- const address = server.address();
10
- if (typeof address === 'object' && address) {
11
- resolve(address.port);
12
- return;
13
- }
14
- reject(new Error('Unable to determine review server port.'));
15
- });
16
- });
17
- }
1
+ import { startReviewHost } from './host.js';
18
2
  export async function startReviewRuntime({ rootPath, mode, files, staticDir, }) {
19
- const app = express();
20
- app.use(express.json({ limit: '2mb' }));
21
- const sessionData = {
22
- rootPath,
23
- mode,
3
+ const host = await startReviewHost({
24
4
  files,
25
- annotations: [],
26
- };
27
- let resolvedResult = null;
28
- let resolveResult = () => { };
29
- const result = new Promise((resolve) => {
30
- resolveResult = resolve;
31
- });
32
- app.get('/api/session', (_request, response) => {
33
- response.json(sessionData);
34
- });
35
- app.post('/api/submit', (request, response) => {
36
- if (resolvedResult) {
37
- response.json(resolvedResult);
38
- return;
39
- }
40
- const body = request.body;
41
- const annotations = Array.isArray(body?.annotations) ? body.annotations : [];
42
- const submittedAt = new Date().toISOString();
43
- const prompt = buildReviewPrompt({ rootPath, files, annotations });
44
- resolvedResult = {
45
- ...sessionData,
46
- annotations,
47
- prompt,
48
- submittedAt,
49
- };
50
- response.json(resolvedResult);
51
- resolveResult(resolvedResult);
52
- });
53
- app.use(express.static(staticDir));
54
- app.get('*', (_request, response) => {
55
- response.sendFile(path.join(staticDir, 'index.html'));
5
+ mode,
6
+ rootPath,
7
+ staticDir,
56
8
  });
57
- const server = createServer(app);
58
- const port = await listen(server);
59
- const url = `http://127.0.0.1:${port}`;
60
9
  return {
61
- port,
62
- url,
63
- result,
64
- close: () => new Promise((resolve) => {
65
- server.close(() => resolve());
10
+ close: host.close,
11
+ port: host.port,
12
+ result: host.result.then((result) => {
13
+ if (!('action' in result)) {
14
+ throw new Error('Review session was abandoned before submission.');
15
+ }
16
+ return result;
66
17
  }),
18
+ url: host.url,
67
19
  };
68
20
  }
69
21
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/server/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/server/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAgB5C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,SAAS,GACY;IACrB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;QACjC,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAClC,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QACF,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReviewResult, ReviewSessionData, ReviewSessionRecord } from '../types.js';
2
+ export interface SessionStoreOptions {
3
+ now?: () => string;
4
+ stateRoot?: string;
5
+ }
6
+ type SessionPatch = Partial<Omit<ReviewSessionRecord, 'createdAt' | 'sessionId'>>;
7
+ export declare function createSession(input: ReviewSessionData, options?: SessionStoreOptions): Promise<ReviewSessionRecord>;
8
+ export declare function getActiveSession(options?: SessionStoreOptions): Promise<ReviewSessionRecord | null>;
9
+ export declare function setSessionPhase(sessionId: string, phase: ReviewSessionRecord['phase'], options?: SessionStoreOptions, patch?: SessionPatch): Promise<ReviewSessionRecord>;
10
+ export declare function writeSessionResult(sessionId: string, result: ReviewResult | null, options?: SessionStoreOptions): Promise<ReviewResult | null>;
11
+ export declare function readSessionResult(sessionId: string, options?: SessionStoreOptions): Promise<ReviewResult | null>;
12
+ export declare function incrementSessionRound(sessionId: string, patch: Partial<Pick<ReviewSessionRecord, 'annotations' | 'files' | 'phase'>>, options?: SessionStoreOptions): Promise<ReviewSessionRecord>;
13
+ export declare function closeSession(sessionId: string, options?: SessionStoreOptions): Promise<void>;
14
+ export {};
15
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/server/session-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAYxF,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;AA6FlF,wBAAsB,aAAa,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAyB9B;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAO7G;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EACnC,OAAO,GAAE,mBAAwB,EACjC,KAAK,GAAE,YAAiB,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAI9B;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW9B;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAE9B;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,EAC5E,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtG"}
@@ -0,0 +1,151 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { appendFile, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ const DEFAULT_STATE_ROOT = path.join(tmpdir(), 'markdown-markdown');
6
+ const ACTIVE_SESSION_FILE = 'active-session.json';
7
+ const SESSION_FILE = 'session.json';
8
+ const RESULT_FILE = 'result.json';
9
+ const EVENTS_FILE = 'events.log';
10
+ function resolveStateRoot(options) {
11
+ return options.stateRoot ?? DEFAULT_STATE_ROOT;
12
+ }
13
+ function getNow(options) {
14
+ return options.now?.() ?? new Date().toISOString();
15
+ }
16
+ function activeSessionPath(stateRoot) {
17
+ return path.join(stateRoot, ACTIVE_SESSION_FILE);
18
+ }
19
+ function sessionDirectory(stateRoot, sessionId) {
20
+ return path.join(stateRoot, 'sessions', sessionId);
21
+ }
22
+ function sessionFilePath(stateRoot, sessionId) {
23
+ return path.join(sessionDirectory(stateRoot, sessionId), SESSION_FILE);
24
+ }
25
+ function resultFilePath(stateRoot, sessionId) {
26
+ return path.join(sessionDirectory(stateRoot, sessionId), RESULT_FILE);
27
+ }
28
+ function eventsFilePath(stateRoot, sessionId) {
29
+ return path.join(sessionDirectory(stateRoot, sessionId), EVENTS_FILE);
30
+ }
31
+ async function readJsonFile(filePath) {
32
+ try {
33
+ const content = await readFile(filePath, 'utf8');
34
+ return JSON.parse(content);
35
+ }
36
+ catch (error) {
37
+ if (error.code === 'ENOENT') {
38
+ return null;
39
+ }
40
+ throw error;
41
+ }
42
+ }
43
+ async function writeJsonFile(filePath, value) {
44
+ await mkdir(path.dirname(filePath), { recursive: true });
45
+ await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
46
+ }
47
+ async function appendSessionEvent(stateRoot, sessionId, event, payload = {}) {
48
+ const record = {
49
+ event,
50
+ timestamp: new Date().toISOString(),
51
+ ...payload,
52
+ };
53
+ await mkdir(path.dirname(eventsFilePath(stateRoot, sessionId)), { recursive: true });
54
+ await appendFile(eventsFilePath(stateRoot, sessionId), `${JSON.stringify(record)}\n`, 'utf8');
55
+ }
56
+ async function readSessionRecord(sessionId, options) {
57
+ return readJsonFile(sessionFilePath(resolveStateRoot(options), sessionId));
58
+ }
59
+ async function writeSessionRecord(session, options) {
60
+ await writeJsonFile(sessionFilePath(resolveStateRoot(options), session.sessionId), session);
61
+ }
62
+ async function updateSessionRecord(sessionId, options, patch) {
63
+ const current = await readSessionRecord(sessionId, options);
64
+ if (!current) {
65
+ throw new Error(`Review session ${sessionId} does not exist.`);
66
+ }
67
+ const nextPatch = typeof patch === 'function' ? patch(current) : patch;
68
+ const updated = {
69
+ ...current,
70
+ ...nextPatch,
71
+ updatedAt: getNow(options),
72
+ };
73
+ await writeSessionRecord(updated, options);
74
+ return updated;
75
+ }
76
+ export async function createSession(input, options = {}) {
77
+ const activeSession = await getActiveSession(options);
78
+ if (activeSession) {
79
+ throw new Error(`An active review session already exists: ${activeSession.sessionId}`);
80
+ }
81
+ const stateRoot = resolveStateRoot(options);
82
+ const sessionId = input.sessionId ?? randomUUID();
83
+ const now = getNow(options);
84
+ const session = {
85
+ ...input,
86
+ annotations: input.annotations ?? [],
87
+ createdAt: now,
88
+ phase: input.phase ?? 'waiting_for_review',
89
+ round: input.round ?? 1,
90
+ sessionId,
91
+ updatedAt: now,
92
+ };
93
+ await writeSessionRecord(session, options);
94
+ await writeJsonFile(activeSessionPath(stateRoot), { sessionId });
95
+ await writeJsonFile(resultFilePath(stateRoot, sessionId), null);
96
+ await appendSessionEvent(stateRoot, sessionId, 'session.created', { phase: session.phase, round: session.round });
97
+ return session;
98
+ }
99
+ export async function getActiveSession(options = {}) {
100
+ const pointer = await readJsonFile(activeSessionPath(resolveStateRoot(options)));
101
+ if (!pointer) {
102
+ return null;
103
+ }
104
+ return readSessionRecord(pointer.sessionId, options);
105
+ }
106
+ export async function setSessionPhase(sessionId, phase, options = {}, patch = {}) {
107
+ const updated = await updateSessionRecord(sessionId, options, { ...patch, phase });
108
+ await appendSessionEvent(resolveStateRoot(options), sessionId, 'session.phase', { phase: updated.phase });
109
+ return updated;
110
+ }
111
+ export async function writeSessionResult(sessionId, result, options = {}) {
112
+ const stateRoot = resolveStateRoot(options);
113
+ await writeJsonFile(resultFilePath(stateRoot, sessionId), result);
114
+ await appendSessionEvent(stateRoot, sessionId, 'session.result', result
115
+ ? {
116
+ phase: result.phase,
117
+ round: result.round,
118
+ }
119
+ : { cleared: true });
120
+ return result;
121
+ }
122
+ export async function readSessionResult(sessionId, options = {}) {
123
+ return readJsonFile(resultFilePath(resolveStateRoot(options), sessionId));
124
+ }
125
+ export async function incrementSessionRound(sessionId, patch, options = {}) {
126
+ const updated = await updateSessionRecord(sessionId, options, (current) => ({
127
+ annotations: patch.annotations ?? current.annotations,
128
+ files: patch.files ?? current.files,
129
+ phase: patch.phase ?? current.phase,
130
+ round: current.round + 1,
131
+ }));
132
+ await appendSessionEvent(resolveStateRoot(options), sessionId, 'session.round', { round: updated.round });
133
+ return updated;
134
+ }
135
+ export async function closeSession(sessionId, options = {}) {
136
+ const stateRoot = resolveStateRoot(options);
137
+ const pointer = await readJsonFile(activeSessionPath(stateRoot));
138
+ if (pointer?.sessionId === sessionId) {
139
+ await rm(activeSessionPath(stateRoot), { force: true });
140
+ }
141
+ const session = await readSessionRecord(sessionId, options);
142
+ if (session) {
143
+ await writeSessionRecord({
144
+ ...session,
145
+ closedAt: getNow(options),
146
+ updatedAt: getNow(options),
147
+ }, options);
148
+ await appendSessionEvent(stateRoot, sessionId, 'session.closed');
149
+ }
150
+ }
151
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/server/session-store.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,6 +6,8 @@ export interface SelectionInfo {
6
6
  }
7
7
  export type BrowserMode = 'app' | 'system';
8
8
  export type CloudflareMode = 'auto' | 'required' | 'off';
9
+ export type ReviewAction = 'finish_review' | 'continue_review';
10
+ export type ReviewLifecyclePhase = 'idle' | 'running' | 'waiting_for_review' | 'submitted_finish' | 'submitted_continue' | 'awaiting_refresh' | 'abandoned' | 'completed' | 'failed';
9
11
  export interface Annotation {
10
12
  annotationId: string;
11
13
  filePath: string;
@@ -24,12 +26,16 @@ export interface MarkdownFile {
24
26
  lineCount: number;
25
27
  }
26
28
  export interface ReviewSessionData {
29
+ sessionId?: string;
27
30
  rootPath: string;
28
31
  mode: 'file' | 'directory';
29
32
  files: MarkdownFile[];
30
33
  annotations: Annotation[];
34
+ phase?: ReviewLifecyclePhase;
35
+ round?: number;
31
36
  }
32
37
  export interface ReviewLifecycleStatusBase {
38
+ action?: ReviewAction;
33
39
  sessionId: string;
34
40
  rootPath: string;
35
41
  mode: 'file' | 'directory';
@@ -40,10 +46,11 @@ export interface ReviewLifecycleStatusBase {
40
46
  outputPath: string | null;
41
47
  statusPath: string | null;
42
48
  startedAt: string;
49
+ round?: number;
43
50
  updatedAt: string;
44
51
  }
45
52
  export type ReviewLifecycleStatus = (ReviewLifecycleStatusBase & {
46
- phase: 'running';
53
+ phase: 'idle' | 'running' | 'waiting_for_review' | 'submitted_finish' | 'submitted_continue' | 'awaiting_refresh' | 'abandoned';
47
54
  }) | (ReviewLifecycleStatusBase & {
48
55
  annotationCount: number;
49
56
  completedAt: string;
@@ -56,9 +63,30 @@ export type ReviewLifecycleStatus = (ReviewLifecycleStatusBase & {
56
63
  });
57
64
  export interface ReviewSubmissionPayload {
58
65
  annotations: Annotation[];
66
+ action?: ReviewAction;
59
67
  }
60
68
  export interface ReviewSubmissionResult extends ReviewSessionData {
69
+ action: ReviewAction;
61
70
  prompt: string;
71
+ round: number;
62
72
  submittedAt: string;
63
73
  }
74
+ export interface ReviewAbandonedResult extends ReviewSessionData {
75
+ abandonedAt: string;
76
+ phase: 'abandoned';
77
+ reason: string;
78
+ round: number;
79
+ }
80
+ export type ReviewResult = ReviewSubmissionResult | ReviewAbandonedResult;
81
+ export interface ReviewSessionRecord extends ReviewSessionData {
82
+ sessionId: string;
83
+ phase: ReviewLifecyclePhase;
84
+ round: number;
85
+ createdAt: string;
86
+ updatedAt: string;
87
+ action?: ReviewAction;
88
+ abandonedReason?: string | null;
89
+ submittedAt?: string | null;
90
+ closedAt?: string | null;
91
+ }
64
92
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAC7B,CAAC,yBAAyB,GAAG;IAC3B,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC,GACF,CAAC,yBAAyB,GAAG;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,GACF,CAAC,yBAAyB,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,CAAC;CACjB,CAAC,CAAC;AAEP,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}