llm-mock-server 1.0.6 → 1.0.7
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/cli.d.ts +3 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +103 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/validators.d.ts +7 -0
- package/dist/cli/validators.d.ts.map +1 -0
- package/dist/cli/validators.js +53 -0
- package/dist/cli/validators.js.map +1 -0
- package/dist/formats/anthropic/index.d.ts +1 -1
- package/dist/formats/anthropic/index.d.ts.map +1 -1
- package/dist/formats/anthropic/index.js +1 -1
- package/dist/formats/anthropic/index.js.map +1 -1
- package/dist/formats/anthropic/parse.d.ts +2 -2
- package/dist/formats/anthropic/parse.d.ts.map +1 -1
- package/dist/formats/anthropic/parse.js +4 -2
- package/dist/formats/anthropic/parse.js.map +1 -1
- package/dist/formats/anthropic/schema.d.ts +1 -1
- package/dist/formats/anthropic/schema.d.ts.map +1 -1
- package/dist/formats/anthropic/schema.js +9 -4
- package/dist/formats/anthropic/schema.js.map +1 -1
- package/dist/formats/anthropic/serialize.d.ts +2 -2
- package/dist/formats/anthropic/serialize.d.ts.map +1 -1
- package/dist/formats/anthropic/serialize.js +76 -19
- package/dist/formats/anthropic/serialize.js.map +1 -1
- package/dist/formats/openai/chat-completions/index.d.ts +3 -0
- package/dist/formats/openai/chat-completions/index.d.ts.map +1 -0
- package/dist/formats/openai/chat-completions/index.js +13 -0
- package/dist/formats/openai/chat-completions/index.js.map +1 -0
- package/dist/formats/openai/chat-completions/parse.d.ts +4 -0
- package/dist/formats/openai/chat-completions/parse.d.ts.map +1 -0
- package/dist/formats/openai/chat-completions/parse.js +33 -0
- package/dist/formats/openai/chat-completions/parse.js.map +1 -0
- package/dist/formats/openai/chat-completions/schema.d.ts +93 -0
- package/dist/formats/openai/chat-completions/schema.d.ts.map +1 -0
- package/dist/formats/openai/chat-completions/schema.js +74 -0
- package/dist/formats/openai/chat-completions/schema.js.map +1 -0
- package/dist/formats/openai/chat-completions/serialize.d.ts +10 -0
- package/dist/formats/openai/chat-completions/serialize.d.ts.map +1 -0
- package/dist/formats/openai/chat-completions/serialize.js +99 -0
- package/dist/formats/openai/chat-completions/serialize.js.map +1 -0
- package/dist/formats/openai/responses/index.d.ts +3 -0
- package/dist/formats/openai/responses/index.d.ts.map +1 -0
- package/dist/formats/openai/responses/index.js +13 -0
- package/dist/formats/openai/responses/index.js.map +1 -0
- package/dist/formats/openai/responses/parse.d.ts +4 -0
- package/dist/formats/openai/responses/parse.d.ts.map +1 -0
- package/dist/formats/openai/responses/parse.js +51 -0
- package/dist/formats/openai/responses/parse.js.map +1 -0
- package/dist/formats/openai/responses/schema.d.ts +103 -0
- package/dist/formats/openai/responses/schema.d.ts.map +1 -0
- package/dist/formats/openai/responses/schema.js +71 -0
- package/dist/formats/openai/responses/schema.js.map +1 -0
- package/dist/formats/openai/responses/serialize.d.ts +10 -0
- package/dist/formats/openai/responses/serialize.d.ts.map +1 -0
- package/dist/formats/openai/responses/serialize.js +273 -0
- package/dist/formats/openai/responses/serialize.js.map +1 -0
- package/dist/formats/request-helpers.d.ts +1 -1
- package/dist/formats/request-helpers.d.ts.map +1 -1
- package/dist/formats/request-helpers.js.map +1 -1
- package/dist/formats/serialize-helpers.d.ts +1 -1
- package/dist/formats/serialize-helpers.d.ts.map +1 -1
- package/dist/formats/serialize-helpers.js +6 -3
- package/dist/formats/serialize-helpers.js.map +1 -1
- package/dist/formats/types.d.ts +2 -1
- package/dist/formats/types.d.ts.map +1 -1
- package/dist/history.d.ts +6 -2
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +2 -0
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +26 -9
- package/dist/loader.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +12 -4
- package/dist/logger.js.map +1 -1
- package/dist/mock-server.d.ts +44 -48
- package/dist/mock-server.d.ts.map +1 -1
- package/dist/mock-server.js +37 -85
- package/dist/mock-server.js.map +1 -1
- package/dist/route-handler.d.ts +1 -1
- package/dist/route-handler.d.ts.map +1 -1
- package/dist/route-handler.js +19 -7
- package/dist/route-handler.js.map +1 -1
- package/dist/rule-builder.d.ts +21 -0
- package/dist/rule-builder.d.ts.map +1 -0
- package/dist/rule-builder.js +58 -0
- package/dist/rule-builder.js.map +1 -0
- package/dist/rule-engine.d.ts +3 -1
- package/dist/rule-engine.d.ts.map +1 -1
- package/dist/rule-engine.js +7 -2
- package/dist/rule-engine.js.map +1 -1
- package/dist/sse-writer.d.ts +1 -1
- package/dist/sse-writer.d.ts.map +1 -1
- package/dist/types/reply.d.ts +51 -8
- package/dist/types/reply.d.ts.map +1 -1
- package/dist/types/request.d.ts +21 -6
- package/dist/types/request.d.ts.map +1 -1
- package/dist/types/rule.d.ts +65 -7
- package/dist/types/rule.d.ts.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +15 -9
- package/.claude/skills/desloppify/SKILL.md +0 -308
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000801.json +0 -242
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000905.json +0 -248
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000917.json +0 -248
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/canonical_import_20260315_000950.json +0 -311
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/claude_launch_prompt.md +0 -17
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/review_result.json +0 -255
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/review_result.template.json +0 -22
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/reviewer_instructions.md +0 -20
- package/.desloppify/external_review_sessions/ext_20260315_000339_a6cdc3e6/session.json +0 -20
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/canonical_import_20260315_050000.json +0 -286
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/canonical_import_20260315_050028.json +0 -303
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/claude_launch_prompt.md +0 -17
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/review_result.json +0 -297
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/review_result.template.json +0 -22
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/reviewer_instructions.md +0 -20
- package/.desloppify/external_review_sessions/ext_20260315_045546_0587ea3b/session.json +0 -20
- package/.desloppify/query.json +0 -1312
- package/.desloppify/review_packet_blind.json +0 -1249
- package/.desloppify/review_packets/holistic_packet_20260315_000339.json +0 -1471
- package/.desloppify/review_packets/holistic_packet_20260315_045546.json +0 -1480
- package/.desloppify/review_packets/holistic_packet_20260315_185401.json +0 -1407
- package/.desloppify/review_packets/holistic_packet_20260315_185613.json +0 -1407
- package/.desloppify/state-typescript.json +0 -8438
- package/.desloppify/state-typescript.json.bak +0 -8432
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-1.log +0 -384
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-10.log +0 -484
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-2.log +0 -408
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-3.log +0 -416
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-4.log +0 -360
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-5.log +0 -360
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-6.log +0 -364
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-7.log +0 -428
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-8.log +0 -388
- package/.desloppify/subagents/runs/20260315_185401/logs/batch-9.log +0 -500
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-1.md +0 -83
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-10.md +0 -108
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-2.md +0 -89
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-3.md +0 -91
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-4.md +0 -77
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-5.md +0 -77
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-6.md +0 -78
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-7.md +0 -94
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-8.md +0 -84
- package/.desloppify/subagents/runs/20260315_185401/prompts/batch-9.md +0 -112
- package/.desloppify/subagents/runs/20260315_185401/results/batch-1.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-10.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-2.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-3.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-4.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-5.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-6.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-7.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-8.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/results/batch-9.raw.txt +0 -0
- package/.desloppify/subagents/runs/20260315_185401/run.log +0 -36
- package/.desloppify/subagents/runs/20260315_185401/run_summary.json +0 -156
- package/.desloppify/subagents/runs/20260315_185613/holistic_findings_merged.json +0 -741
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-1.log +0 -579
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-10.log +0 -1537
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-2.log +0 -829
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-3.log +0 -927
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-4.log +0 -429
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-5.log +0 -276
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-6.log +0 -450
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-7.log +0 -730
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-8.log +0 -698
- package/.desloppify/subagents/runs/20260315_185613/logs/batch-9.log +0 -938
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-1.md +0 -83
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-10.md +0 -108
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-2.md +0 -89
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-3.md +0 -91
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-4.md +0 -77
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-5.md +0 -77
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-6.md +0 -78
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-7.md +0 -94
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-8.md +0 -84
- package/.desloppify/subagents/runs/20260315_185613/prompts/batch-9.md +0 -112
- package/.desloppify/subagents/runs/20260315_185613/results/batch-1.raw.txt +0 -78
- package/.desloppify/subagents/runs/20260315_185613/results/batch-10.raw.txt +0 -242
- package/.desloppify/subagents/runs/20260315_185613/results/batch-2.raw.txt +0 -102
- package/.desloppify/subagents/runs/20260315_185613/results/batch-3.raw.txt +0 -94
- package/.desloppify/subagents/runs/20260315_185613/results/batch-4.raw.txt +0 -86
- package/.desloppify/subagents/runs/20260315_185613/results/batch-5.raw.txt +0 -1
- package/.desloppify/subagents/runs/20260315_185613/results/batch-6.raw.txt +0 -87
- package/.desloppify/subagents/runs/20260315_185613/results/batch-7.raw.txt +0 -1
- package/.desloppify/subagents/runs/20260315_185613/results/batch-8.raw.txt +0 -107
- package/.desloppify/subagents/runs/20260315_185613/results/batch-9.raw.txt +0 -67
- package/.desloppify/subagents/runs/20260315_185613/run.log +0 -96
- package/.desloppify/subagents/runs/20260315_185613/run_summary.json +0 -156
- package/.editorconfig +0 -12
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/docs.yml +0 -46
- package/.github/workflows/test.yml +0 -40
- package/.markdownlint.jsonc +0 -11
- package/.node-version +0 -1
- package/.oxfmtrc.json +0 -9
- package/.oxlintrc.json +0 -35
- package/docs/ARCHITECTURE.md +0 -125
- package/scorecard.png +0 -0
- package/src/cli/cli.ts +0 -141
- package/src/cli/validators.ts +0 -68
- package/src/formats/anthropic/index.ts +0 -14
- package/src/formats/anthropic/parse.ts +0 -70
- package/src/formats/anthropic/schema.ts +0 -74
- package/src/formats/anthropic/serialize.ts +0 -179
- package/src/formats/openai/chat-completions/index.ts +0 -14
- package/src/formats/openai/chat-completions/parse.ts +0 -47
- package/src/formats/openai/chat-completions/schema.ts +0 -92
- package/src/formats/openai/chat-completions/serialize.ts +0 -146
- package/src/formats/openai/responses/index.ts +0 -14
- package/src/formats/openai/responses/parse.ts +0 -73
- package/src/formats/openai/responses/schema.ts +0 -86
- package/src/formats/openai/responses/serialize.ts +0 -328
- package/src/formats/request-helpers.ts +0 -56
- package/src/formats/serialize-helpers.ts +0 -43
- package/src/formats/types.ts +0 -26
- package/src/history.ts +0 -70
- package/src/index.ts +0 -46
- package/src/loader.ts +0 -246
- package/src/logger.ts +0 -70
- package/src/mock-server.ts +0 -203
- package/src/route-handler.ts +0 -144
- package/src/rule-builder.ts +0 -73
- package/src/rule-engine.ts +0 -165
- package/src/sse-writer.ts +0 -35
- package/src/types/reply.ts +0 -92
- package/src/types/request.ts +0 -56
- package/src/types/rule.ts +0 -125
- package/src/types.ts +0 -24
- package/test/cli-validators.test.ts +0 -151
- package/test/formats/anthropic.test.ts +0 -336
- package/test/formats/openai.test.ts +0 -316
- package/test/formats/parse-helpers.test.ts +0 -315
- package/test/formats/responses.test.ts +0 -380
- package/test/helpers/make-req.ts +0 -18
- package/test/history.test.ts +0 -361
- package/test/loader.test.ts +0 -333
- package/test/logger.test.ts +0 -344
- package/test/mock-server.test.ts +0 -619
- package/test/rule-engine.test.ts +0 -229
- package/tsconfig.json +0 -24
- package/tsconfig.test.json +0 -11
- package/typedoc.json +0 -9
- package/vitest.config.ts +0 -18
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
2026-03-15T18:56:13+00:00 run-start runner=codex parallel=True max_parallel=1 timeout=1200s heartbeat=15.0s stall_warning=0s stall_kill=120s retries=2 retry_backoff=2.0s upper_bound=200m selected=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
2
|
-
2026-03-15T18:56:13+00:00 run-path /Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613
|
|
3
|
-
2026-03-15T18:56:13+00:00 packet /Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/review_packets/holistic_packet_20260315_185613.json
|
|
4
|
-
2026-03-15T18:56:13+00:00 blind-packet /Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/review_packet_blind.json
|
|
5
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=1 position=1/10
|
|
6
|
-
2026-03-15T18:56:13+00:00 batch-start batch=1 position=1/10
|
|
7
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=2 position=2/10
|
|
8
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=3 position=3/10
|
|
9
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=4 position=4/10
|
|
10
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=5 position=5/10
|
|
11
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=6 position=6/10
|
|
12
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=7 position=7/10
|
|
13
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=8 position=8/10
|
|
14
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=9 position=9/10
|
|
15
|
-
2026-03-15T18:56:13+00:00 batch-queued batch=10 position=10/10
|
|
16
|
-
2026-03-15T18:56:28+00:00 heartbeat active=[1] queued=[2, 3, 4, 5, 6, 7, 8, 9, 10] elapsed={1:15}
|
|
17
|
-
2026-03-15T18:56:43+00:00 heartbeat active=[1] queued=[2, 3, 4, 5, 6, 7, 8, 9, 10] elapsed={1:30}
|
|
18
|
-
2026-03-15T18:56:58+00:00 heartbeat active=[1] queued=[2, 3, 4, 5, 6, 7, 8, 9, 10] elapsed={1:45}
|
|
19
|
-
2026-03-15T18:57:02+00:00 batch-start batch=2 position=2/10
|
|
20
|
-
2026-03-15T18:57:02+00:00 batch-done batch=1 position=1/10 code=0 elapsed=49
|
|
21
|
-
2026-03-15T18:57:17+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:15}
|
|
22
|
-
2026-03-15T18:57:32+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:30}
|
|
23
|
-
2026-03-15T18:57:47+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:45}
|
|
24
|
-
2026-03-15T18:58:02+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:60}
|
|
25
|
-
2026-03-15T18:58:17+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:75}
|
|
26
|
-
2026-03-15T18:58:32+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:90}
|
|
27
|
-
2026-03-15T18:58:47+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:105}
|
|
28
|
-
2026-03-15T18:59:02+00:00 heartbeat active=[2] queued=[3, 4, 5, 6, 7, 8, 9, 10] elapsed={2:120}
|
|
29
|
-
2026-03-15T18:59:03+00:00 batch-done batch=2 position=2/10 code=0 elapsed=121
|
|
30
|
-
2026-03-15T18:59:03+00:00 batch-start batch=3 position=3/10
|
|
31
|
-
2026-03-15T18:59:18+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:15}
|
|
32
|
-
2026-03-15T18:59:33+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:30}
|
|
33
|
-
2026-03-15T18:59:48+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:45}
|
|
34
|
-
2026-03-15T19:00:03+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:60}
|
|
35
|
-
2026-03-15T19:00:18+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:75}
|
|
36
|
-
2026-03-15T19:00:33+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:90}
|
|
37
|
-
2026-03-15T19:00:48+00:00 heartbeat active=[3] queued=[4, 5, 6, 7, 8, 9, 10] elapsed={3:105}
|
|
38
|
-
2026-03-15T19:00:54+00:00 batch-done batch=3 position=3/10 code=0 elapsed=110
|
|
39
|
-
2026-03-15T19:00:54+00:00 batch-start batch=4 position=4/10
|
|
40
|
-
2026-03-15T19:01:09+00:00 heartbeat active=[4] queued=[5, 6, 7, 8, 9, 10] elapsed={4:15}
|
|
41
|
-
2026-03-15T19:01:24+00:00 heartbeat active=[4] queued=[5, 6, 7, 8, 9, 10] elapsed={4:30}
|
|
42
|
-
2026-03-15T19:01:39+00:00 heartbeat active=[4] queued=[5, 6, 7, 8, 9, 10] elapsed={4:45}
|
|
43
|
-
2026-03-15T19:01:48+00:00 batch-done batch=4 position=4/10 code=0 elapsed=54
|
|
44
|
-
2026-03-15T19:01:48+00:00 batch-start batch=5 position=5/10
|
|
45
|
-
2026-03-15T19:02:03+00:00 heartbeat active=[5] queued=[6, 7, 8, 9, 10] elapsed={5:15}
|
|
46
|
-
2026-03-15T19:02:18+00:00 heartbeat active=[5] queued=[6, 7, 8, 9, 10] elapsed={5:30}
|
|
47
|
-
2026-03-15T19:02:28+00:00 batch-start batch=6 position=6/10
|
|
48
|
-
2026-03-15T19:02:28+00:00 batch-done batch=5 position=5/10 code=0 elapsed=40
|
|
49
|
-
2026-03-15T19:02:43+00:00 heartbeat active=[6] queued=[7, 8, 9, 10] elapsed={6:15}
|
|
50
|
-
2026-03-15T19:02:58+00:00 heartbeat active=[6] queued=[7, 8, 9, 10] elapsed={6:30}
|
|
51
|
-
2026-03-15T19:03:13+00:00 heartbeat active=[6] queued=[7, 8, 9, 10] elapsed={6:45}
|
|
52
|
-
2026-03-15T19:03:19+00:00 batch-start batch=7 position=7/10
|
|
53
|
-
2026-03-15T19:03:19+00:00 batch-done batch=6 position=6/10 code=0 elapsed=50
|
|
54
|
-
2026-03-15T19:03:34+00:00 heartbeat active=[7] queued=[8, 9, 10] elapsed={7:15}
|
|
55
|
-
2026-03-15T19:03:49+00:00 heartbeat active=[7] queued=[8, 9, 10] elapsed={7:30}
|
|
56
|
-
2026-03-15T19:04:04+00:00 heartbeat active=[7] queued=[8, 9, 10] elapsed={7:45}
|
|
57
|
-
2026-03-15T19:04:19+00:00 heartbeat active=[7] queued=[8, 9, 10] elapsed={7:60}
|
|
58
|
-
2026-03-15T19:04:34+00:00 heartbeat active=[7] queued=[8, 9, 10] elapsed={7:75}
|
|
59
|
-
2026-03-15T19:04:49+00:00 heartbeat active=[7] queued=[8, 9, 10] elapsed={7:90}
|
|
60
|
-
2026-03-15T19:05:02+00:00 batch-done batch=7 position=7/10 code=0 elapsed=103
|
|
61
|
-
2026-03-15T19:05:02+00:00 batch-start batch=8 position=8/10
|
|
62
|
-
2026-03-15T19:05:17+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:15}
|
|
63
|
-
2026-03-15T19:05:32+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:30}
|
|
64
|
-
2026-03-15T19:05:47+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:45}
|
|
65
|
-
2026-03-15T19:06:02+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:60}
|
|
66
|
-
2026-03-15T19:06:17+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:75}
|
|
67
|
-
2026-03-15T19:06:32+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:90}
|
|
68
|
-
2026-03-15T19:06:47+00:00 heartbeat active=[8] queued=[9, 10] elapsed={8:105}
|
|
69
|
-
2026-03-15T19:06:51+00:00 batch-start batch=9 position=9/10
|
|
70
|
-
2026-03-15T19:06:51+00:00 batch-done batch=8 position=8/10 code=0 elapsed=108
|
|
71
|
-
2026-03-15T19:07:06+00:00 heartbeat active=[9] queued=[10] elapsed={9:15}
|
|
72
|
-
2026-03-15T19:07:21+00:00 heartbeat active=[9] queued=[10] elapsed={9:30}
|
|
73
|
-
2026-03-15T19:07:36+00:00 heartbeat active=[9] queued=[10] elapsed={9:45}
|
|
74
|
-
2026-03-15T19:07:51+00:00 heartbeat active=[9] queued=[10] elapsed={9:60}
|
|
75
|
-
2026-03-15T19:08:06+00:00 heartbeat active=[9] queued=[10] elapsed={9:75}
|
|
76
|
-
2026-03-15T19:08:21+00:00 heartbeat active=[9] queued=[10] elapsed={9:90}
|
|
77
|
-
2026-03-15T19:08:35+00:00 batch-done batch=9 position=9/10 code=0 elapsed=103
|
|
78
|
-
2026-03-15T19:08:35+00:00 batch-start batch=10 position=10/10
|
|
79
|
-
2026-03-15T19:08:50+00:00 heartbeat active=[10] queued=[] elapsed={10:15}
|
|
80
|
-
2026-03-15T19:09:05+00:00 heartbeat active=[10] queued=[] elapsed={10:30}
|
|
81
|
-
2026-03-15T19:09:20+00:00 heartbeat active=[10] queued=[] elapsed={10:45}
|
|
82
|
-
2026-03-15T19:09:35+00:00 heartbeat active=[10] queued=[] elapsed={10:60}
|
|
83
|
-
2026-03-15T19:09:50+00:00 heartbeat active=[10] queued=[] elapsed={10:75}
|
|
84
|
-
2026-03-15T19:10:05+00:00 heartbeat active=[10] queued=[] elapsed={10:90}
|
|
85
|
-
2026-03-15T19:10:20+00:00 heartbeat active=[10] queued=[] elapsed={10:105}
|
|
86
|
-
2026-03-15T19:10:35+00:00 heartbeat active=[10] queued=[] elapsed={10:120}
|
|
87
|
-
2026-03-15T19:10:50+00:00 heartbeat active=[10] queued=[] elapsed={10:135}
|
|
88
|
-
2026-03-15T19:11:05+00:00 heartbeat active=[10] queued=[] elapsed={10:150}
|
|
89
|
-
2026-03-15T19:11:20+00:00 heartbeat active=[10] queued=[] elapsed={10:165}
|
|
90
|
-
2026-03-15T19:11:35+00:00 heartbeat active=[10] queued=[] elapsed={10:180}
|
|
91
|
-
2026-03-15T19:11:50+00:00 heartbeat active=[10] queued=[] elapsed={10:195}
|
|
92
|
-
2026-03-15T19:12:05+00:00 heartbeat active=[10] queued=[] elapsed={10:210}
|
|
93
|
-
2026-03-15T19:12:20+00:00 heartbeat active=[10] queued=[] elapsed={10:225}
|
|
94
|
-
2026-03-15T19:12:25+00:00 batch-done batch=10 position=10/10 code=0 elapsed=230
|
|
95
|
-
2026-03-15T19:12:25+00:00 run-summary /Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/run_summary.json
|
|
96
|
-
2026-03-15T19:12:25+00:00 run-finished successful=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] failed=[] imported=/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/holistic_findings_merged.json
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"created_at": "2026-03-15T18:56:13+00:00",
|
|
3
|
-
"run_stamp": "20260315_185613",
|
|
4
|
-
"runner": "codex",
|
|
5
|
-
"parallel": true,
|
|
6
|
-
"selected_batches": [
|
|
7
|
-
1,
|
|
8
|
-
2,
|
|
9
|
-
3,
|
|
10
|
-
4,
|
|
11
|
-
5,
|
|
12
|
-
6,
|
|
13
|
-
7,
|
|
14
|
-
8,
|
|
15
|
-
9,
|
|
16
|
-
10
|
|
17
|
-
],
|
|
18
|
-
"successful_batches": [
|
|
19
|
-
1,
|
|
20
|
-
2,
|
|
21
|
-
3,
|
|
22
|
-
4,
|
|
23
|
-
5,
|
|
24
|
-
6,
|
|
25
|
-
7,
|
|
26
|
-
8,
|
|
27
|
-
9,
|
|
28
|
-
10
|
|
29
|
-
],
|
|
30
|
-
"failed_batches": [],
|
|
31
|
-
"allow_partial": false,
|
|
32
|
-
"max_parallel_batches": 1,
|
|
33
|
-
"batch_timeout_seconds": 1200,
|
|
34
|
-
"batch_max_retries": 2,
|
|
35
|
-
"batch_retry_backoff_seconds": 2.0,
|
|
36
|
-
"batch_heartbeat_seconds": 15.0,
|
|
37
|
-
"batch_stall_warning_seconds": 0,
|
|
38
|
-
"batch_stall_kill_seconds": 120,
|
|
39
|
-
"immutable_packet": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/review_packets/holistic_packet_20260315_185613.json",
|
|
40
|
-
"blind_packet": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/review_packet_blind.json",
|
|
41
|
-
"run_dir": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613",
|
|
42
|
-
"logs_dir": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs",
|
|
43
|
-
"run_log": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/run.log",
|
|
44
|
-
"batches": {
|
|
45
|
-
"1": {
|
|
46
|
-
"position": 1,
|
|
47
|
-
"status": "succeeded",
|
|
48
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-1.md",
|
|
49
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-1.raw.txt",
|
|
50
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-1.log",
|
|
51
|
-
"started_at": "2026-03-15T18:56:13+00:00",
|
|
52
|
-
"elapsed_seconds": 49,
|
|
53
|
-
"exit_code": 0,
|
|
54
|
-
"completed_at": "2026-03-15T18:57:02+00:00"
|
|
55
|
-
},
|
|
56
|
-
"2": {
|
|
57
|
-
"position": 2,
|
|
58
|
-
"status": "succeeded",
|
|
59
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-2.md",
|
|
60
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-2.raw.txt",
|
|
61
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-2.log",
|
|
62
|
-
"started_at": "2026-03-15T18:57:02+00:00",
|
|
63
|
-
"elapsed_seconds": 121,
|
|
64
|
-
"exit_code": 0,
|
|
65
|
-
"completed_at": "2026-03-15T18:59:03+00:00"
|
|
66
|
-
},
|
|
67
|
-
"3": {
|
|
68
|
-
"position": 3,
|
|
69
|
-
"status": "succeeded",
|
|
70
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-3.md",
|
|
71
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-3.raw.txt",
|
|
72
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-3.log",
|
|
73
|
-
"started_at": "2026-03-15T18:59:03+00:00",
|
|
74
|
-
"elapsed_seconds": 110,
|
|
75
|
-
"exit_code": 0,
|
|
76
|
-
"completed_at": "2026-03-15T19:00:54+00:00"
|
|
77
|
-
},
|
|
78
|
-
"4": {
|
|
79
|
-
"position": 4,
|
|
80
|
-
"status": "succeeded",
|
|
81
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-4.md",
|
|
82
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-4.raw.txt",
|
|
83
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-4.log",
|
|
84
|
-
"started_at": "2026-03-15T19:00:54+00:00",
|
|
85
|
-
"elapsed_seconds": 54,
|
|
86
|
-
"exit_code": 0,
|
|
87
|
-
"completed_at": "2026-03-15T19:01:48+00:00"
|
|
88
|
-
},
|
|
89
|
-
"5": {
|
|
90
|
-
"position": 5,
|
|
91
|
-
"status": "succeeded",
|
|
92
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-5.md",
|
|
93
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-5.raw.txt",
|
|
94
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-5.log",
|
|
95
|
-
"started_at": "2026-03-15T19:01:48+00:00",
|
|
96
|
-
"elapsed_seconds": 40,
|
|
97
|
-
"exit_code": 0,
|
|
98
|
-
"completed_at": "2026-03-15T19:02:28+00:00"
|
|
99
|
-
},
|
|
100
|
-
"6": {
|
|
101
|
-
"position": 6,
|
|
102
|
-
"status": "succeeded",
|
|
103
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-6.md",
|
|
104
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-6.raw.txt",
|
|
105
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-6.log",
|
|
106
|
-
"started_at": "2026-03-15T19:02:28+00:00",
|
|
107
|
-
"elapsed_seconds": 50,
|
|
108
|
-
"exit_code": 0,
|
|
109
|
-
"completed_at": "2026-03-15T19:03:19+00:00"
|
|
110
|
-
},
|
|
111
|
-
"7": {
|
|
112
|
-
"position": 7,
|
|
113
|
-
"status": "succeeded",
|
|
114
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-7.md",
|
|
115
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-7.raw.txt",
|
|
116
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-7.log",
|
|
117
|
-
"started_at": "2026-03-15T19:03:19+00:00",
|
|
118
|
-
"elapsed_seconds": 103,
|
|
119
|
-
"exit_code": 0,
|
|
120
|
-
"completed_at": "2026-03-15T19:05:02+00:00"
|
|
121
|
-
},
|
|
122
|
-
"8": {
|
|
123
|
-
"position": 8,
|
|
124
|
-
"status": "succeeded",
|
|
125
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-8.md",
|
|
126
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-8.raw.txt",
|
|
127
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-8.log",
|
|
128
|
-
"started_at": "2026-03-15T19:05:02+00:00",
|
|
129
|
-
"elapsed_seconds": 108,
|
|
130
|
-
"exit_code": 0,
|
|
131
|
-
"completed_at": "2026-03-15T19:06:51+00:00"
|
|
132
|
-
},
|
|
133
|
-
"9": {
|
|
134
|
-
"position": 9,
|
|
135
|
-
"status": "succeeded",
|
|
136
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-9.md",
|
|
137
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-9.raw.txt",
|
|
138
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-9.log",
|
|
139
|
-
"started_at": "2026-03-15T19:06:51+00:00",
|
|
140
|
-
"elapsed_seconds": 103,
|
|
141
|
-
"exit_code": 0,
|
|
142
|
-
"completed_at": "2026-03-15T19:08:35+00:00"
|
|
143
|
-
},
|
|
144
|
-
"10": {
|
|
145
|
-
"position": 10,
|
|
146
|
-
"status": "succeeded",
|
|
147
|
-
"prompt_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/prompts/batch-10.md",
|
|
148
|
-
"result_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/results/batch-10.raw.txt",
|
|
149
|
-
"log_path": "/Users/suyash.x.srijan/Documents/Personal_Projects/llm-mock-server/.desloppify/subagents/runs/20260315_185613/logs/batch-10.log",
|
|
150
|
-
"started_at": "2026-03-15T19:08:35+00:00",
|
|
151
|
-
"elapsed_seconds": 230,
|
|
152
|
-
"exit_code": 0,
|
|
153
|
-
"completed_at": "2026-03-15T19:12:25+00:00"
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
package/.editorconfig
DELETED
package/.github/dependabot.yml
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
name: Deploy API docs
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
|
|
7
|
-
permissions:
|
|
8
|
-
contents: read
|
|
9
|
-
pages: write
|
|
10
|
-
id-token: write
|
|
11
|
-
|
|
12
|
-
concurrency:
|
|
13
|
-
group: pages
|
|
14
|
-
cancel-in-progress: true
|
|
15
|
-
|
|
16
|
-
jobs:
|
|
17
|
-
deploy:
|
|
18
|
-
runs-on: ubuntu-latest
|
|
19
|
-
environment:
|
|
20
|
-
name: github-pages
|
|
21
|
-
url: ${{ steps.deployment.outputs.page_url }}
|
|
22
|
-
|
|
23
|
-
steps:
|
|
24
|
-
- name: Checkout code
|
|
25
|
-
uses: actions/checkout@v6.0.2
|
|
26
|
-
|
|
27
|
-
- name: Setup Node.js
|
|
28
|
-
uses: actions/setup-node@v6.3.0
|
|
29
|
-
with:
|
|
30
|
-
node-version-file: 'package.json'
|
|
31
|
-
cache: 'npm'
|
|
32
|
-
|
|
33
|
-
- name: Install dependencies
|
|
34
|
-
run: npm ci
|
|
35
|
-
|
|
36
|
-
- name: Generate docs
|
|
37
|
-
run: npm run docs
|
|
38
|
-
|
|
39
|
-
- name: Upload pages artifact
|
|
40
|
-
uses: actions/upload-pages-artifact@v4
|
|
41
|
-
with:
|
|
42
|
-
path: docs/api
|
|
43
|
-
|
|
44
|
-
- name: Deploy to GitHub Pages
|
|
45
|
-
id: deployment
|
|
46
|
-
uses: actions/deploy-pages@v4
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
name: Test
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches: [main]
|
|
6
|
-
|
|
7
|
-
permissions:
|
|
8
|
-
contents: read
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
test:
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
|
|
14
|
-
steps:
|
|
15
|
-
- name: Checkout code
|
|
16
|
-
uses: actions/checkout@v6.0.2
|
|
17
|
-
|
|
18
|
-
- name: Setup Node.js
|
|
19
|
-
uses: actions/setup-node@v6.3.0
|
|
20
|
-
with:
|
|
21
|
-
node-version-file: 'package.json'
|
|
22
|
-
cache: 'npm'
|
|
23
|
-
|
|
24
|
-
- name: Install dependencies
|
|
25
|
-
run: npm ci
|
|
26
|
-
|
|
27
|
-
- name: Type check
|
|
28
|
-
run: tsc --noEmit && tsc --noEmit -p tsconfig.test.json
|
|
29
|
-
|
|
30
|
-
- name: Format check
|
|
31
|
-
run: npm run fmt:check
|
|
32
|
-
|
|
33
|
-
- name: Lint
|
|
34
|
-
run: npm run lint
|
|
35
|
-
|
|
36
|
-
- name: Validate docs
|
|
37
|
-
run: npm run docs:check
|
|
38
|
-
|
|
39
|
-
- name: Run tests
|
|
40
|
-
run: npm test
|
package/.markdownlint.jsonc
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"default": true,
|
|
3
|
-
// Allow longer lines in tables and code blocks
|
|
4
|
-
"MD013": false,
|
|
5
|
-
// Allow duplicate headings in different sections
|
|
6
|
-
"MD024": { "siblings_only": true },
|
|
7
|
-
// Allow inline HTML
|
|
8
|
-
"MD033": false,
|
|
9
|
-
// Allow bare URLs
|
|
10
|
-
"MD034": false
|
|
11
|
-
}
|
package/.node-version
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
22
|
package/.oxfmtrc.json
DELETED
package/.oxlintrc.json
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"plugins": ["typescript", "unicorn", "oxc", "import", "promise", "node"],
|
|
3
|
-
"categories": {
|
|
4
|
-
"correctness": "error",
|
|
5
|
-
"suspicious": "error",
|
|
6
|
-
"perf": "warn"
|
|
7
|
-
},
|
|
8
|
-
"rules": {
|
|
9
|
-
"no-console": "off",
|
|
10
|
-
"no-unused-vars": "off",
|
|
11
|
-
"no-magic-numbers": ["warn", { "ignore": [0, 1, -1, 2, 10] }],
|
|
12
|
-
"no-await-in-loop": "off",
|
|
13
|
-
"typescript/no-unused-vars": "off",
|
|
14
|
-
"typescript/no-non-null-assertion": "off",
|
|
15
|
-
"unicorn/filename-case": "off",
|
|
16
|
-
"unicorn/no-null": "off",
|
|
17
|
-
"unicorn/prevent-abbreviations": "off",
|
|
18
|
-
"unicorn/no-array-for-each": "off",
|
|
19
|
-
"unicorn/consistent-function-scoping": "off",
|
|
20
|
-
"import/no-default-export": "off",
|
|
21
|
-
"import/no-named-export": "off",
|
|
22
|
-
"import/prefer-default-export": "off",
|
|
23
|
-
"import/group-exports": "off",
|
|
24
|
-
"oxc/no-map-spread": "off"
|
|
25
|
-
},
|
|
26
|
-
"overrides": [
|
|
27
|
-
{
|
|
28
|
-
"files": ["test/**/*.ts"],
|
|
29
|
-
"rules": {
|
|
30
|
-
"no-magic-numbers": "off"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
],
|
|
34
|
-
"ignorePatterns": ["dist/", "node_modules/"]
|
|
35
|
-
}
|
package/docs/ARCHITECTURE.md
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# llm-mock-server architecture
|
|
2
|
-
|
|
3
|
-
A mock LLM server built on Fastify. Clients send requests in OpenAI Chat Completions, Anthropic Messages, or OpenAI Responses API format. The server normalises them into a common shape, matches against registered rules, and sends back responses in the right format.
|
|
4
|
-
|
|
5
|
-
```mermaid
|
|
6
|
-
flowchart LR
|
|
7
|
-
Client["Test or SDK client"]
|
|
8
|
-
Server["llm-mock-server<br/>(Fastify)"]
|
|
9
|
-
Rules["Rule engine"]
|
|
10
|
-
|
|
11
|
-
Client <-->|"Chat Completions / Messages / Responses"| Server
|
|
12
|
-
Server <--> Rules
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Table of contents
|
|
16
|
-
|
|
17
|
-
- [Startup](#startup)
|
|
18
|
-
- [Format system](#format-system)
|
|
19
|
-
- [Request lifecycle](#request-lifecycle)
|
|
20
|
-
- [Rule engine](#rule-engine)
|
|
21
|
-
- [Types](#types)
|
|
22
|
-
- [Streaming](#streaming)
|
|
23
|
-
- [File loading](#file-loading)
|
|
24
|
-
- [Logging](#logging)
|
|
25
|
-
- [Security model](#security-model)
|
|
26
|
-
|
|
27
|
-
## Startup
|
|
28
|
-
|
|
29
|
-
[`cli.ts`](src/cli/cli.ts) is the CLI entry point. It parses flags with Commander, validates them through [`validators.ts`](src/cli/validators.ts), creates a `MockServer`, loads any rule files, and handles SIGINT/SIGTERM. With `--watch`, it sets up `fs.watch()` on the rules path and reloads on changes.
|
|
30
|
-
|
|
31
|
-
[`MockServer`](src/mock-server.ts) is the main class. The constructor creates a Fastify instance and registers a route handler for each format. Rule authoring (`when()`, `whenTool()`, `whenToolResult()`, `nextError()`) lives in [`RuleBuilder`](src/rule-builder.ts) and is proxied onto `MockServer` via `.bind()`. Consumers interact with it through the rule methods, `fallback()`, `load()`, and the lifecycle methods.
|
|
32
|
-
|
|
33
|
-
[`createMock()`](src/index.ts) is a convenience that creates a server and starts it in one call.
|
|
34
|
-
|
|
35
|
-
## Format system
|
|
36
|
-
|
|
37
|
-
A format is anything that satisfies the [`Format`](src/formats/types.ts) interface. It needs to be able to parse requests, serialise streaming and non-streaming responses, and produce error bodies.
|
|
38
|
-
|
|
39
|
-
Three formats are included:
|
|
40
|
-
|
|
41
|
-
| Format | Route | Directory |
|
|
42
|
-
| ------ | ----- | --------- |
|
|
43
|
-
| OpenAI Chat Completions | `POST /v1/chat/completions` | [`formats/openai/chat-completions/`](src/formats/openai/chat-completions/) |
|
|
44
|
-
| Anthropic Messages | `POST /v1/messages` | [`formats/anthropic/`](src/formats/anthropic/) |
|
|
45
|
-
| OpenAI Responses | `POST /v1/responses` | [`formats/openai/responses/`](src/formats/openai/responses/) |
|
|
46
|
-
|
|
47
|
-
Each format directory has three files:
|
|
48
|
-
|
|
49
|
-
- `parse.ts` takes the incoming request body (plus HTTP headers and path) and turns it into a normalised [`MockRequest`](src/types/request.ts)
|
|
50
|
-
- `serialize.ts` takes a [`ReplyObject`](src/types/reply.ts) and produces SSE chunks or a JSON response
|
|
51
|
-
- `index.ts` wires parse and serialize together into a `Format` object
|
|
52
|
-
|
|
53
|
-
Shared helpers are split into request and response files: [`request-helpers.ts`](src/formats/request-helpers.ts) has `buildMockRequest()` and `isStreaming()` (used by parsers), and [`serialize-helpers.ts`](src/formats/serialize-helpers.ts) has `genId()`, `splitText()`, `shouldEmitText()`, and `finishReason()` (used by serialisers).
|
|
54
|
-
|
|
55
|
-
To add a new format (say, Gemini), you would create a new directory with those three files and add it to the `formats` array in `mock-server.ts`. Everything else (rule matching, streaming, logging, history) works automatically.
|
|
56
|
-
|
|
57
|
-
## Request lifecycle
|
|
58
|
-
|
|
59
|
-
```mermaid
|
|
60
|
-
flowchart TD
|
|
61
|
-
A[Incoming POST] --> B[Format parses body into MockRequest]
|
|
62
|
-
B --> C[Rule engine finds first matching rule]
|
|
63
|
-
C --> D{Match found?}
|
|
64
|
-
D -->|yes| E[Resolve reply, static or function]
|
|
65
|
-
D -->|no| F[Use fallback reply]
|
|
66
|
-
E --> G{Error reply?}
|
|
67
|
-
F --> G
|
|
68
|
-
G -->|yes| H[Return HTTP error with format-specific body]
|
|
69
|
-
G -->|no| I{Streaming?}
|
|
70
|
-
I -->|yes| J[Serialise to SSE chunks and write with latency]
|
|
71
|
-
I -->|no| K[Serialise to JSON and return]
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
The route handler logic lives in [`route-handler.ts`](src/route-handler.ts). It is generic over the format and gets its dependencies (engine, history, logger, options) through a `RouteHandlerDeps` object.
|
|
75
|
-
|
|
76
|
-
## Rule engine
|
|
77
|
-
|
|
78
|
-
[`RuleEngine`](src/rule-engine.ts) holds rules in an array and evaluates them in order. The first match wins.
|
|
79
|
-
|
|
80
|
-
Each rule has a compiled matcher function, a resolver (either a static value or a function), and an optional `remaining` counter for `.times()`. When a rule's counter hits zero it gets removed from the list.
|
|
81
|
-
|
|
82
|
-
`moveToFront()` is what powers the `.first()` API. Rules that call `.first()` get moved to index 0.
|
|
83
|
-
|
|
84
|
-
The matching itself goes through [`compileMatcher()`](src/rule-engine.ts), which turns a `Match` (string, regex, object, or function) into a predicate. Object matchers check each specified field with AND logic. An optional `predicate` field on `MatchObject` runs last, after all structured fields have passed, so you can combine declarative matching with custom logic.
|
|
85
|
-
|
|
86
|
-
## Types
|
|
87
|
-
|
|
88
|
-
Types are split across three files in [`src/types/`](src/types/):
|
|
89
|
-
|
|
90
|
-
- [`request.ts`](src/types/request.ts) has `MockRequest`, `Message`, `ToolDef`, and `FormatName`
|
|
91
|
-
- [`reply.ts`](src/types/reply.ts) has `Reply`, `ReplyObject`, `ErrorReply`, `ToolCall`, `Resolver`, and `ReplyOptions`
|
|
92
|
-
- [`rule.ts`](src/types/rule.ts) has `Match`, `MatchObject`, `PendingRule`, `RuleHandle`, `RuleSummary`, `Handler`, and `Rule`
|
|
93
|
-
|
|
94
|
-
[`src/types.ts`](src/types.ts) re-exports everything as a barrel for the public API. Internal modules import directly from the leaf files.
|
|
95
|
-
|
|
96
|
-
## Streaming
|
|
97
|
-
|
|
98
|
-
[`writeSSE()`](src/sse-writer.ts) writes an array of `SSEChunk` objects to the raw HTTP response as server-sent events. It adds a delay between chunks if latency is configured.
|
|
99
|
-
|
|
100
|
-
Each format's `serialize()` builds the chunk array. Text gets split by `chunkSize` when it's set. The Responses format also assigns incrementing `sequence_number` values to every event using a closure-based counter.
|
|
101
|
-
|
|
102
|
-
## File loading
|
|
103
|
-
|
|
104
|
-
[`loadRulesFromPath()`](src/loader.ts) loads rules from disk. It takes a `LoadContext` with the rule engine and an optional fallback setter. A `Map` dispatches by file extension:
|
|
105
|
-
|
|
106
|
-
- `.json5` and `.json` files get parsed with Zod validation. Files can be a bare array of rules or an object with optional `templates`, `fallback`, and `rules` fields. Template references (`$name`) are resolved at load time. Rules can use `reply` for a single response or `replies` for a sequence
|
|
107
|
-
- `.ts`, `.js`, and `.mjs` files get dynamically imported. The default export (a `Handler` or array) is registered. A named `fallback` export sets the server fallback
|
|
108
|
-
|
|
109
|
-
Directories are read and processed in sorted order.
|
|
110
|
-
|
|
111
|
-
## Logging
|
|
112
|
-
|
|
113
|
-
[`Logger`](src/logger.ts) is a threshold-based logger. Each level has a numeric priority and messages below the threshold are dropped. Output is timestamped and coloured with picocolors.
|
|
114
|
-
|
|
115
|
-
## Security model
|
|
116
|
-
|
|
117
|
-
The threat model is simple: the server runs locally or in CI, loading files written by the developer. There is no multi-tenant isolation or sandboxing.
|
|
118
|
-
|
|
119
|
-
Handler files (`.ts`, `.js`, `.mjs`) are loaded via `import()` and execute with full process permissions. The trust boundary is the file system path passed to `load()` or `--rules`. If an attacker can write to that path, they already have code execution on the machine. No path restriction is enforced because legitimate setups often load rules from outside the project directory.
|
|
120
|
-
|
|
121
|
-
JSON5 files go through Zod validation and never execute code. The only dynamic construction is `new RegExp()` for regex patterns in rule files, which could hang on pathological backtracking patterns but poses no injection risk.
|
|
122
|
-
|
|
123
|
-
Fastify caps request bodies at 1 MB by default. The server binds to `127.0.0.1` unless explicitly configured otherwise. Responses are serialised through JSON, so reply text cannot break out of SSE framing.
|
|
124
|
-
|
|
125
|
-
CLI inputs (port, host, latency, log level) are validated through [`validators.ts`](src/cli/validators.ts) before use.
|
package/scorecard.png
DELETED
|
Binary file
|