@selesai/code 0.5.24 → 0.5.26

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 (55) hide show
  1. package/dist/extensions/pi-powerline-footer/fixed-editor/terminal-split.ts +4 -1
  2. package/dist/extensions/pi-powerline-footer/index.ts +1 -0
  3. package/dist/extensions/workflow/adapter.ts +2 -2
  4. package/dist/extensions/workflow/modes/loop.ts +30 -11
  5. package/docs/workflows.md +3 -3
  6. package/package.json +2 -2
  7. package/dist/core/provider-display-names.d.ts +0 -2
  8. package/dist/core/provider-display-names.d.ts.map +0 -1
  9. package/dist/core/provider-display-names.js +0 -36
  10. package/dist/core/provider-display-names.js.map +0 -1
  11. package/dist/data/capabilities.d.ts +0 -48
  12. package/dist/data/capabilities.d.ts.map +0 -1
  13. package/dist/data/capabilities.js +0 -282
  14. package/dist/data/capabilities.js.map +0 -1
  15. package/dist/data/navigation.d.ts +0 -3
  16. package/dist/data/navigation.d.ts.map +0 -1
  17. package/dist/data/navigation.js +0 -90
  18. package/dist/data/navigation.js.map +0 -1
  19. package/dist/extensions/index.d.ts +0 -3
  20. package/dist/extensions/index.d.ts.map +0 -1
  21. package/dist/extensions/index.js +0 -9
  22. package/dist/extensions/index.js.map +0 -1
  23. package/dist/extensions/llama/client.d.ts +0 -61
  24. package/dist/extensions/llama/client.d.ts.map +0 -1
  25. package/dist/extensions/llama/client.js +0 -309
  26. package/dist/extensions/llama/client.js.map +0 -1
  27. package/dist/extensions/llama/huggingface.d.ts +0 -23
  28. package/dist/extensions/llama/huggingface.d.ts.map +0 -1
  29. package/dist/extensions/llama/huggingface.js +0 -146
  30. package/dist/extensions/llama/huggingface.js.map +0 -1
  31. package/dist/extensions/llama/index.d.ts +0 -3
  32. package/dist/extensions/llama/index.d.ts.map +0 -1
  33. package/dist/extensions/llama/index.js +0 -211
  34. package/dist/extensions/llama/index.js.map +0 -1
  35. package/dist/extensions/llama/provider.d.ts +0 -10
  36. package/dist/extensions/llama/provider.d.ts.map +0 -1
  37. package/dist/extensions/llama/provider.js +0 -106
  38. package/dist/extensions/llama/provider.js.map +0 -1
  39. package/dist/extensions/llama/ui.d.ts +0 -42
  40. package/dist/extensions/llama/ui.d.ts.map +0 -1
  41. package/dist/extensions/llama/ui.js +0 -420
  42. package/dist/extensions/llama/ui.js.map +0 -1
  43. package/dist/extensions/pi-intercom/lifecycle.test.ts +0 -60
  44. package/dist/extensions/pi-subagents/src/runs/background/wait.ts +0 -353
  45. package/dist/extensions/pi-subagents/test/unit/live-async-resume.test.ts +0 -170
  46. package/dist/extensions/pi-subagents/test/unit/wait.test.ts +0 -398
  47. package/dist/extensions/question/dialog-adapter.ts +0 -96
  48. package/dist/extensions/question/tests/ui-protocol.test.ts +0 -157
  49. package/dist/extensions/question/tui-adapter.ts +0 -15
  50. package/dist/extensions/question/ui-protocol.ts +0 -31
  51. package/dist/extensions/workflow/modes/quick.ts +0 -150
  52. package/dist/modes/interactive/interactive-mode.test.d.ts +0 -2
  53. package/dist/modes/interactive/interactive-mode.test.d.ts.map +0 -1
  54. package/dist/modes/interactive/interactive-mode.test.js +0 -45
  55. package/dist/modes/interactive/interactive-mode.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/data/capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["export type Category =\n | \"delegation-and-workflows\"\n | \"research-and-interaction\"\n | \"continuity-and-recovery\"\n | \"terminal-workspace\"\n | \"skills-and-productivity\";\n\nexport interface Capability {\n slug: string;\n category: Category;\n en: { displayName: string; benefit: string };\n id: { displayName: string; benefit: string };\n sourcePaths: string[];\n sourceLinks: { text: string; url: string }[];\n guideRoute: string;\n piComparison: \"core-differentiator\" | \"bundled\" | \"ergonomic\" | \"reference\";\n}\n\nconst repo = \"https://github.com/SelesaiInTech/selesai-code/blob/main\";\n\nconst srcPath = (paths: string[]) => paths;\nconst links = (label: string, path: string) => ({\n text: label,\n url: `${repo}/${path}`,\n});\n\nexport const categories: { id: Category; en: string; id: string }[] = [\n { id: \"delegation-and-workflows\", en: \"Delegation and workflows\", id: \"Delegasi dan alur kerja\" },\n { id: \"research-and-interaction\", en: \"Research and interaction\", id: \"Riset dan interaksi\" },\n { id: \"continuity-and-recovery\", en: \"Continuity and recovery\", id: \"Kontinuitas dan pemulihan\" },\n { id: \"terminal-workspace\", en: \"Terminal workspace\", id: \"Ruang kerja terminal\" },\n { id: \"skills-and-productivity\", en: \"Skills and productivity\", id: \"Skill dan produktivitas\" },\n];\n\nexport const capabilities: Capability[] = [\n {\n slug: \"pi-subagents\",\n category: \"delegation-and-workflows\",\n en: { displayName: \"Subagent delegation\", benefit: \"Run focused in-tree agent roles in foreground, background, parallel, or chained modes with tooling and model controls.\" },\n id: { displayName: \"Delegasi subagent\", benefit: \"Jalankan peran agent yang fokus secara in-tree dalam mode foreground, background, paralel, atau berantai dengan kontrol tooling dan model.\" },\n sourcePaths: [\"src/extensions/pi-subagents/\", \"README.md\"],\n sourceLinks: [\n links(\"Extension source\", \"src/extensions/pi-subagents/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/delegation/pi-subagents\",\n piComparison: \"core-differentiator\",\n },\n {\n slug: \"workflow\",\n category: \"delegation-and-workflows\",\n en: { displayName: \"Durable workflows\", benefit: \"Resumeable, stateful project workflows across prototype, quick, and task modes with explicit lifecycle management.\" },\n id: { displayName: \"Workflow tahan lama\", benefit: \"Alur kerja proyek yang stateful dan dapat dilanjutkan kembali dengan mode prototype, quick, dan task serta manajemen siklus hidup eksplisit.\" },\n sourcePaths: [\"src/extensions/workflow/\", \"README.md\"],\n sourceLinks: [\n links(\"Workflow source\", \"src/extensions/workflow/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/delegation/workflow\",\n piComparison: \"core-differentiator\",\n },\n {\n slug: \"pi-web-agent\",\n category: \"research-and-interaction\",\n en: { displayName: \"Web research\", benefit: \"Single `web_explore` research tool with bounded search, fetch, source ranking, and headless-browser escalation.\" },\n id: { displayName: \"Riset web\", benefit: \"Satu peralatan `web_explore` untuk riset dengan pencarian terbatas, fetch, peringkat sumber, dan eskalasi headless browser.\" },\n sourcePaths: [\"src/extensions/pi-web-agent/\", \"README.md\"],\n sourceLinks: [\n links(\"Web agent source\", \"src/extensions/pi-web-agent/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/research/web-agent\",\n piComparison: \"bundled\",\n },\n {\n slug: \"question\",\n category: \"research-and-interaction\",\n en: { displayName: \"Interactive questions\", benefit: \"TUI for single, multi-select, freeform, and image/info questions with keyboard navigation and filtering.\" },\n id: { displayName: \"Pertanyaan interaktif\", benefit: \"TUI untuk pertanyaan single/multi-select, freeform, dan image/info dengan navigasi keyboard dan filtering.\" },\n sourcePaths: [\"src/extensions/question/\", \"README.md\"],\n sourceLinks: [\n links(\"Question source\", \"src/extensions/question/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/research/question\",\n piComparison: \"bundled\",\n },\n {\n slug: \"grep-app\",\n category: \"research-and-interaction\",\n en: { displayName: \"Public code search\", benefit: \"Search GitHub code through grep.app and fetch matching source without leaving the agent.\" },\n id: { displayName: \"Pencarian kode publik\", benefit: \"Cari kode GitHub melalui grep.app dan ambil source yang cocok tanpa meninggalkan agent.\" },\n sourcePaths: [\"src/extensions/grep-app/\", \"README.md\"],\n sourceLinks: [\n links(\"grep.app source\", \"src/extensions/grep-app/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/research/grep-app\",\n piComparison: \"bundled\",\n },\n {\n slug: \"pi-intercom\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Session coordination\", benefit: \"Local 1:1 session messaging, ask/reply, and attachments between named Selesai sessions.\" },\n id: { displayName: \"Koordinasi sesi\", benefit: \"Pesan lokal 1:1 antar sesi Selesai yang diberi nama, ask/reply, dan lampiran.\" },\n sourcePaths: [\"src/extensions/pi-intercom/\", \"README.md\"],\n sourceLinks: [\n links(\"Intercom source\", \"src/extensions/pi-intercom/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/intercom\",\n piComparison: \"bundled\",\n },\n {\n slug: \"undo\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Turn-level undo\", benefit: \"Undo tracked edits, writes, and detected mutating shell commands one turn at a time.\" },\n id: { displayName: \"Undo per turn\", benefit: \"Batalkan edit, write, dan shell command bermutasi yang terdeteksi satu turn demi satu turn.\" },\n sourcePaths: [\"src/extensions/undo.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Undo source\", \"src/extensions/undo.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/undo\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"copy-turn\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Copy turn\", benefit: \"Copy a user or assistant result from the session by hash using `/cp <hash>`.\" },\n id: { displayName: \"Salin turn\", benefit: \"Salin hasil user atau assistant dari sesi menggunakan hash dengan `/cp <hash>`.\" },\n sourcePaths: [\"src/extensions/copy-turn.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Copy turn source\", \"src/extensions/copy-turn.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/copy-turn\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"context-compaction-reminder\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Context reminder\", benefit: \"Warn when a conversation grows large and suggest `/handoff-new` to reduce context and cost.\" },\n id: { displayName: \"Pengingat konteks\", benefit: \"Peringatkan saat percakapan membesar dan sarankan `/handoff-new` untuk mengurangi konteks dan biaya.\" },\n sourcePaths: [\"src/extensions/context-compaction-reminder.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Reminder source\", \"src/extensions/context-compaction-reminder.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/context-reminder\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"handoff-new\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Session handoff\", benefit: \"Create an editable continuation prompt in a clean session to reset context and cut token spend.\" },\n id: { displayName: \"Handoff sesi\", benefit: \"Buat prompt kelanjutan yang dapat diedit dalam sesi bersih untuk mereset konteks dan menghemat token.\" },\n sourcePaths: [\"src/extensions/handoff-new.ts\", \"README.md\", \"src/skills/handoff/\", \"src/skills/selesai-handoff/\"],\n sourceLinks: [\n links(\"Handoff source\", \"src/extensions/handoff-new.ts\"),\n links(\"Handoff skill\", \"src/skills/handoff/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/handoff-new\",\n piComparison: \"core-differentiator\",\n },\n {\n slug: \"pi-rewind-hook\",\n category: \"continuity-and-recovery\",\n en: { displayName: \"Rewind checkpoints\", benefit: \"Exact git-backed file checkpoints across `/fork`, `/tree`, resumed sessions, and session lineage.\" },\n id: { displayName: \"Checkpoint rewind\", benefit: \"Checkpoint file yang didukung git secara tepat di `/fork`, `/tree`, sesi yang dilanjutkan, dan silsilah sesi.\" },\n sourcePaths: [\"src/extensions/pi-rewind-hook/\", \"README.md\"],\n sourceLinks: [\n links(\"Rewind source\", \"src/extensions/pi-rewind-hook/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/continuity/rewind\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"pi-powerline-footer\",\n category: \"terminal-workspace\",\n en: { displayName: \"Powerline footer\", benefit: \"Status bar, fixed-editor layout, recurring guide tour, persistent bash, stashes, themes, and Nerd Font detection.\" },\n id: { displayName: \"Footer powerline\", benefit: \"Status bar, tata letak editor tetap, tur panduan berulang, bash persisten, stash, tema, dan deteksi Nerd Font.\" },\n sourcePaths: [\"src/extensions/pi-powerline-footer/\", \"README.md\", \"src/core/footer-data-provider.ts\"],\n sourceLinks: [\n links(\"Footer source\", \"src/extensions/pi-powerline-footer/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/workspace/powerline-footer\",\n piComparison: \"bundled\",\n },\n {\n slug: \"web-agent-onboarding\",\n category: \"terminal-workspace\",\n en: { displayName: \"Web agent onboarding\", benefit: \"First-run Brave Search onboarding for the web agent, with DuckDuckGo fallback.\" },\n id: { displayName: \"Onboarding web agent\", benefit: \"Onboarding Brave Search pertama kali untuk web agent, dengan fallback DuckDuckGo.\" },\n sourcePaths: [\"src/extensions/web-agent-onboarding.ts\", \"src/extensions/pi-web-agent/\", \"README.md\"],\n sourceLinks: [\n links(\"Onboarding source\", \"src/extensions/web-agent-onboarding.ts\"),\n links(\"Web agent source\", \"src/extensions/pi-web-agent/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/workspace/web-agent-onboarding\",\n piComparison: \"bundled\",\n },\n {\n slug: \"tokenin-onboarding\",\n category: \"terminal-workspace\",\n en: { displayName: \"Token onboarding\", benefit: \"First-run onboarding path for provider credentials and API tokens.\" },\n id: { displayName: \"Onboarding token\", benefit: \"Jalur onboarding pertama kali untuk kredensial provider dan token API.\" },\n sourcePaths: [\"src/extensions/tokenin-onboarding.ts\", \"README.md\"],\n sourceLinks: [\n links(\"Token onboarding source\", \"src/extensions/tokenin-onboarding.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/workspace/tokenin-onboarding\",\n piComparison: \"bundled\",\n },\n {\n slug: \"inline-skills\",\n category: \"skills-and-productivity\",\n en: { displayName: \"Inline skills\", benefit: \"Lightweight inline skill invitations without separate skill files.\" },\n id: { displayName: \"Skill inline\", benefit: \"Ajakan skill inline ringan tanpa file skill terpisah.\" },\n sourcePaths: [\"src/extensions/inline-skills.ts\", \"README.md\", \"src/core/skills.ts\"],\n sourceLinks: [\n links(\"Inline skills source\", \"src/extensions/inline-skills.ts\"),\n links(\"Skills loader\", \"src/core/skills.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/inline-skills\",\n piComparison: \"ergonomic\",\n },\n {\n slug: \"ponytail\",\n category: \"skills-and-productivity\",\n en: { displayName: \"Ponytail communication\", benefit: \"Minimal, compressed communication mode and review helpers invoked via `/skill:ponytail*`.\" },\n id: { displayName: \"Komunikasi Ponytail\", benefit: \"Mode komunikasi minimal dan terkompresi serta helper review, dipanggil via `/skill:ponytail*`.\" },\n sourcePaths: [\"src/extensions/ponytail/\", \"src/skills/ponytail*/\", \"README.md\"],\n sourceLinks: [\n links(\"Ponytail extension\", \"src/extensions/ponytail/\"),\n links(\"Ponytail skills\", \"src/skills/ponytail/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/ponytail\",\n piComparison: \"bundled\",\n },\n {\n slug: \"caveman\",\n category: \"skills-and-productivity\",\n en: { displayName: \"Caveman communication\", benefit: \"Abbreviated, focused response style invoked via `/skill:caveman`.\" },\n id: { displayName: \"Komunikasi Caveman\", benefit: \"Gaya responsi yang dipersingkat dan fokus, dipanggil via `/skill:caveman`.\" },\n sourcePaths: [\"src/extensions/caveman/\", \"src/skills/caveman/\", \"README.md\"],\n sourceLinks: [\n links(\"Caveman extension\", \"src/extensions/caveman/\"),\n links(\"Caveman skill\", \"src/skills/caveman/\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/caveman\",\n piComparison: \"bundled\",\n },\n {\n slug: \"rtk\",\n category: \"skills-and-productivity\",\n en: { displayName: \"RTK integration\", benefit: \"Rewrite compatible shell commands to reduce noisy output and token burn when `rtk` is installed.\" },\n id: { displayName: \"Integrasi RTK\", benefit: \"Tulis ulang shell command yang kompatibel untuk mengurangi output berisik dan penggunaan token saat `rtk` terpasang.\" },\n sourcePaths: [\"src/extensions/rtk.ts\", \"README.md\"],\n sourceLinks: [\n links(\"RTK source\", \"src/extensions/rtk.ts\"),\n links(\"README mention\", \"README.md\"),\n ],\n guideRoute: \"capabilities/skills/rtk\",\n piComparison: \"ergonomic\",\n },\n];\n\nexport function capabilitiesByCategory(cat: Category) {\n return capabilities.filter((c) => c.category === cat);\n}\n\nexport function getCapability(slug: string) {\n return capabilities.find((c) => c.slug === slug);\n}\n\nexport function categoryLabel(cat: Category, locale: \"en\" | \"id\") {\n return categories.find((c) => c.id === cat)?.[locale] ?? cat;\n}\n\nexport const EN_LABELS = {\n install: \"Install\",\n getStarted: \"Get started\",\n whySelesai: \"Why Selesai\",\n capabilities: \"Capabilities\",\n evidence: \"Evidence\",\n changelog: \"Changelog\",\n accessibility: \"Accessibility & privacy\",\n};\n\nexport const ID_LABELS = {\n install: \"Instal\",\n getStarted: \"Mulai\",\n whySelesai: \"Mengapa Selesai\",\n capabilities: \"Kemampuan\",\n evidence: \"Bukti dan metodologi\",\n changelog: \"Changelog\",\n accessibility: \"Aksesibilitas & privasi\",\n};\n"]}
@@ -1,3 +0,0 @@
1
- import type { SidebarConfig } from "@astrojs/starlight/schemas/sidebar";
2
- export declare const navigation: SidebarConfig;
3
- //# sourceMappingURL=navigation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/data/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAyBxE,eAAO,MAAM,UAAU,EAAE,aAmExB,CAAC","sourcesContent":["import type { SidebarConfig } from \"@astrojs/starlight/schemas/sidebar\";\nimport { capabilities, categories } from \"./capabilities.ts\";\n\nconst en = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.en.displayName, link: `/${c.guideRoute}/` }));\n return {\n label: cat.en,\n collapsed: true,\n items,\n };\n});\n\nconst id = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.id.displayName, link: `/id/${c.guideRoute}/` }));\n return {\n label: cat.id,\n collapsed: true,\n items,\n };\n});\n\nexport const navigation: SidebarConfig = [\n {\n label: \"Home\",\n link: \"/\",\n },\n {\n label: \"Get started\",\n link: \"/get-started/\",\n },\n {\n label: \"Why Selesai\",\n link: \"/why-selesai/\",\n },\n {\n label: \"Capabilities\",\n link: \"/capabilities/\",\n },\n {\n label: \"Evidence\",\n link: \"/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/changelog/\",\n },\n {\n label: \"Accessibility\",\n link: \"/accessibility/\",\n },\n {\n label: \"Guides\",\n collapsed: true,\n items: en,\n },\n {\n label: \"Beranda\",\n link: \"/id/\",\n },\n {\n label: \"Mulai\",\n link: \"/id/get-started/\",\n },\n {\n label: \"Mengapa Selesai\",\n link: \"/id/why-selesai/\",\n },\n {\n label: \"Kemampuan\",\n link: \"/id/capabilities/\",\n },\n {\n label: \"Bukti dan metodologi\",\n link: \"/id/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/id/changelog/\",\n },\n {\n label: \"Aksesibilitas\",\n link: \"/id/accessibility/\",\n },\n {\n label: \"Panduan\",\n collapsed: true,\n items: id,\n },\n];\n"]}
@@ -1,90 +0,0 @@
1
- import { capabilities, categories } from "./capabilities.js";
2
- const en = categories.map((cat) => {
3
- const items = capabilities
4
- .filter((c) => c.category === cat.id)
5
- .map((c) => ({ label: c.en.displayName, link: `/${c.guideRoute}/` }));
6
- return {
7
- label: cat.en,
8
- collapsed: true,
9
- items,
10
- };
11
- });
12
- const id = categories.map((cat) => {
13
- const items = capabilities
14
- .filter((c) => c.category === cat.id)
15
- .map((c) => ({ label: c.id.displayName, link: `/id/${c.guideRoute}/` }));
16
- return {
17
- label: cat.id,
18
- collapsed: true,
19
- items,
20
- };
21
- });
22
- export const navigation = [
23
- {
24
- label: "Home",
25
- link: "/",
26
- },
27
- {
28
- label: "Get started",
29
- link: "/get-started/",
30
- },
31
- {
32
- label: "Why Selesai",
33
- link: "/why-selesai/",
34
- },
35
- {
36
- label: "Capabilities",
37
- link: "/capabilities/",
38
- },
39
- {
40
- label: "Evidence",
41
- link: "/evidence/",
42
- },
43
- {
44
- label: "Changelog",
45
- link: "/changelog/",
46
- },
47
- {
48
- label: "Accessibility",
49
- link: "/accessibility/",
50
- },
51
- {
52
- label: "Guides",
53
- collapsed: true,
54
- items: en,
55
- },
56
- {
57
- label: "Beranda",
58
- link: "/id/",
59
- },
60
- {
61
- label: "Mulai",
62
- link: "/id/get-started/",
63
- },
64
- {
65
- label: "Mengapa Selesai",
66
- link: "/id/why-selesai/",
67
- },
68
- {
69
- label: "Kemampuan",
70
- link: "/id/capabilities/",
71
- },
72
- {
73
- label: "Bukti dan metodologi",
74
- link: "/id/evidence/",
75
- },
76
- {
77
- label: "Changelog",
78
- link: "/id/changelog/",
79
- },
80
- {
81
- label: "Aksesibilitas",
82
- link: "/id/accessibility/",
83
- },
84
- {
85
- label: "Panduan",
86
- collapsed: true,
87
- items: id,
88
- },
89
- ];
90
- //# sourceMappingURL=navigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/data/navigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IACxE,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,SAAS,EAAE,IAAI;QACf,KAAK;KACN,CAAC;AAAA,CACH,CAAC,CAAC;AAEH,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,YAAY;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,SAAS,EAAE,IAAI;QACf,KAAK;KACN,CAAC;AAAA,CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC;QACE,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG;KACV;IACD;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,eAAe;KACtB;IACD;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,eAAe;KACtB;IACD;QACE,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,gBAAgB;KACvB;IACD;QACE,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,YAAY;KACnB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,aAAa;KACpB;IACD;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,iBAAiB;KACxB;IACD;QACE,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE;KACV;IACD;QACE,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,MAAM;KACb;IACD;QACE,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,kBAAkB;KACzB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,mBAAmB;KAC1B;IACD;QACE,KAAK,EAAE,sBAAsB;QAC7B,IAAI,EAAE,eAAe;KACtB;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,gBAAgB;KACvB;IACD;QACE,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,oBAAoB;KAC3B;IACD;QACE,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE;KACV;CACF,CAAC","sourcesContent":["import type { SidebarConfig } from \"@astrojs/starlight/schemas/sidebar\";\nimport { capabilities, categories } from \"./capabilities.ts\";\n\nconst en = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.en.displayName, link: `/${c.guideRoute}/` }));\n return {\n label: cat.en,\n collapsed: true,\n items,\n };\n});\n\nconst id = categories.map((cat) => {\n const items = capabilities\n .filter((c) => c.category === cat.id)\n .map((c) => ({ label: c.id.displayName, link: `/id/${c.guideRoute}/` }));\n return {\n label: cat.id,\n collapsed: true,\n items,\n };\n});\n\nexport const navigation: SidebarConfig = [\n {\n label: \"Home\",\n link: \"/\",\n },\n {\n label: \"Get started\",\n link: \"/get-started/\",\n },\n {\n label: \"Why Selesai\",\n link: \"/why-selesai/\",\n },\n {\n label: \"Capabilities\",\n link: \"/capabilities/\",\n },\n {\n label: \"Evidence\",\n link: \"/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/changelog/\",\n },\n {\n label: \"Accessibility\",\n link: \"/accessibility/\",\n },\n {\n label: \"Guides\",\n collapsed: true,\n items: en,\n },\n {\n label: \"Beranda\",\n link: \"/id/\",\n },\n {\n label: \"Mulai\",\n link: \"/id/get-started/\",\n },\n {\n label: \"Mengapa Selesai\",\n link: \"/id/why-selesai/\",\n },\n {\n label: \"Kemampuan\",\n link: \"/id/capabilities/\",\n },\n {\n label: \"Bukti dan metodologi\",\n link: \"/id/evidence/\",\n },\n {\n label: \"Changelog\",\n link: \"/id/changelog/\",\n },\n {\n label: \"Aksesibilitas\",\n link: \"/id/accessibility/\",\n },\n {\n label: \"Panduan\",\n collapsed: true,\n items: id,\n },\n];\n"]}
@@ -1,3 +0,0 @@
1
- import type { InlineExtension } from "../core/extensions/types.ts";
2
- export declare const builtInExtensions: InlineExtension[];
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAAmE,CAAC","sourcesContent":["import type { InlineExtension } from \"../core/extensions/types.ts\";\nimport llamaExtension from \"./llama/index.ts\";\n\nexport const builtInExtensions: InlineExtension[] = [{ name: \"llama.cpp\", factory: llamaExtension, hidden: true }];\n"]}
@@ -1,9 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.builtInExtensions = void 0;
7
- const index_ts_1 = __importDefault(require("./llama/index.js"));
8
- exports.builtInExtensions = [{ name: "llama.cpp", factory: index_ts_1.default, hidden: true }];
9
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":";;;;;;AACA,gEAA8C;AAEjC,QAAA,iBAAiB,GAAsB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAc,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC","sourcesContent":["import type { InlineExtension } from \"../core/extensions/types.ts\";\nimport llamaExtension from \"./llama/index.ts\";\n\nexport const builtInExtensions: InlineExtension[] = [{ name: \"llama.cpp\", factory: llamaExtension, hidden: true }];\n"]}
@@ -1,61 +0,0 @@
1
- export type LlamaModelStatus = "unloaded" | "loading" | "loaded" | "downloading" | "sleeping";
2
- export interface LlamaModelInfo {
3
- id: string;
4
- aliases?: string[];
5
- status: {
6
- value: LlamaModelStatus;
7
- args?: string[];
8
- failed?: boolean;
9
- exit_code?: number;
10
- progress?: Record<string, {
11
- done: number;
12
- total: number;
13
- }>;
14
- };
15
- architecture?: {
16
- input_modalities?: string[];
17
- output_modalities?: string[];
18
- };
19
- source?: string;
20
- meta?: {
21
- n_ctx?: number;
22
- n_ctx_train?: number;
23
- size?: number;
24
- ftype?: string;
25
- };
26
- }
27
- export interface LlamaModelsResponse {
28
- data: LlamaModelInfo[];
29
- object?: string;
30
- }
31
- export interface LlamaModelEvent {
32
- model: string;
33
- event: string;
34
- data?: unknown;
35
- }
36
- export interface LlamaProgress {
37
- message: string;
38
- ratio?: number;
39
- detail?: string;
40
- }
41
- export declare function formatBytes(bytes: number): string;
42
- export declare function normalizeLlamaServerUrl(value: string): string;
43
- export declare function llamaInferenceUrl(serverUrl: string): string;
44
- export declare class LlamaClient {
45
- readonly serverUrl: string;
46
- private readonly apiKey;
47
- constructor(serverUrl: string, apiKey?: string);
48
- private request;
49
- list(options?: {
50
- reload?: boolean;
51
- signal?: AbortSignal;
52
- }): Promise<LlamaModelInfo[]>;
53
- load(model: string, signal?: AbortSignal): Promise<void>;
54
- unload(model: string, signal?: AbortSignal): Promise<void>;
55
- unloadAndWait(model: string, signal?: AbortSignal): Promise<void>;
56
- download(model: string, signal?: AbortSignal): Promise<void>;
57
- watch(onEvent: (event: LlamaModelEvent) => void, signal?: AbortSignal): Promise<void>;
58
- loadAndWait(model: string, onProgress: (progress: LlamaProgress) => void, signal?: AbortSignal): Promise<LlamaModelInfo>;
59
- downloadAndWait(model: string, onProgress: (progress: LlamaProgress) => void, signal?: AbortSignal): Promise<LlamaModelInfo[]>;
60
- }
61
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/client.ts"],"names":[],"mappings":"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","sourcesContent":["export type LlamaModelStatus = \"unloaded\" | \"loading\" | \"loaded\" | \"downloading\" | \"sleeping\";\n\nexport interface LlamaModelInfo {\n\tid: string;\n\taliases?: string[];\n\tstatus: {\n\t\tvalue: LlamaModelStatus;\n\t\targs?: string[];\n\t\tfailed?: boolean;\n\t\texit_code?: number;\n\t\tprogress?: Record<string, { done: number; total: number }>;\n\t};\n\tarchitecture?: {\n\t\tinput_modalities?: string[];\n\t\toutput_modalities?: string[];\n\t};\n\tsource?: string;\n\tmeta?: {\n\t\tn_ctx?: number;\n\t\tn_ctx_train?: number;\n\t\tsize?: number;\n\t\tftype?: string;\n\t};\n}\n\nexport interface LlamaModelsResponse {\n\tdata: LlamaModelInfo[];\n\tobject?: string;\n}\n\nexport interface LlamaModelEvent {\n\tmodel: string;\n\tevent: string;\n\tdata?: unknown;\n}\n\nexport interface LlamaProgress {\n\tmessage: string;\n\tratio?: number;\n\tdetail?: string;\n}\n\nfunction errorMessage(payload: unknown, fallback: string): string {\n\tif (typeof payload !== \"object\" || payload === null) return fallback;\n\tconst error = (payload as { error?: unknown }).error;\n\tif (typeof error !== \"object\" || error === null) return fallback;\n\tconst message = (error as { message?: unknown }).message;\n\treturn typeof message === \"string\" && message ? message : fallback;\n}\n\nfunction isModelInfo(value: unknown): value is LlamaModelInfo {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst candidate = value as { id?: unknown; status?: { value?: unknown } };\n\treturn typeof candidate.id === \"string\" && typeof candidate.status?.value === \"string\";\n}\n\nfunction linkSignal(source: AbortSignal | undefined, target: AbortController): () => void {\n\tif (!source) return () => {};\n\tif (source.aborted) {\n\t\ttarget.abort(source.reason);\n\t\treturn () => {};\n\t}\n\tconst abort = () => target.abort(source.reason);\n\tsource.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason ?? new Error(\"Cancelled\"));\n\t\t\treturn;\n\t\t}\n\t\tconst abort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\treject(signal?.reason ?? new Error(\"Cancelled\"));\n\t\t};\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t});\n}\n\nfunction parseLoadProgress(data: unknown): LlamaProgress | undefined {\n\tif (typeof data !== \"object\" || data === null) return undefined;\n\tconst progress = (data as { progress?: unknown }).progress;\n\tif (typeof progress !== \"object\" || progress === null) return undefined;\n\tconst value = progress as { stages?: unknown; current?: unknown; stage?: unknown; value?: unknown };\n\tconst stage =\n\t\ttypeof value.current === \"string\" ? value.current : typeof value.stage === \"string\" ? value.stage : undefined;\n\tconst stages = Array.isArray(value.stages)\n\t\t? value.stages.filter((entry): entry is string => typeof entry === \"string\")\n\t\t: [];\n\tconst stageRatio = typeof value.value === \"number\" ? Math.max(0, Math.min(1, value.value)) : undefined;\n\tlet ratio = stageRatio;\n\tif (stage && stages.length > 0) {\n\t\tconst index = stages.indexOf(stage);\n\t\tif (index >= 0) ratio = (index + (stageRatio ?? 0)) / stages.length;\n\t}\n\treturn {\n\t\tmessage: stage ? `Loading ${stage.replaceAll(\"_\", \" \")}` : \"Loading model\",\n\t\tratio,\n\t};\n}\n\nfunction parseDownloadProgress(data: unknown): LlamaProgress | undefined {\n\tif (typeof data !== \"object\" || data === null) return undefined;\n\tconst nested = (data as { progress?: unknown }).progress;\n\tconst files = typeof nested === \"object\" && nested !== null ? nested : data;\n\tlet done = 0;\n\tlet total = 0;\n\tfor (const value of Object.values(files as Record<string, unknown>)) {\n\t\tif (typeof value !== \"object\" || value === null) continue;\n\t\tconst entry = value as { done?: unknown; total?: unknown };\n\t\tif (typeof entry.done !== \"number\" || typeof entry.total !== \"number\") continue;\n\t\tdone += entry.done;\n\t\ttotal += entry.total;\n\t}\n\tif (total <= 0) return undefined;\n\treturn {\n\t\tmessage: \"Downloading model\",\n\t\tratio: done / total,\n\t\tdetail: `${formatBytes(done)} / ${formatBytes(total)}`,\n\t};\n}\n\nexport function formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes} B`;\n\tconst units = [\"KiB\", \"MiB\", \"GiB\", \"TiB\"];\n\tlet value = bytes / 1024;\n\tlet unit = units[0]!;\n\tfor (let index = 1; index < units.length && value >= 1024; index++) {\n\t\tvalue /= 1024;\n\t\tunit = units[index]!;\n\t}\n\treturn `${value >= 10 ? value.toFixed(1) : value.toFixed(2)} ${unit}`;\n}\n\nexport function normalizeLlamaServerUrl(value: string): string {\n\tconst url = new URL(value.trim());\n\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(\"Server URL must use http or https\");\n\t}\n\turl.hash = \"\";\n\turl.search = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/u, \"\").replace(/\\/v1$/u, \"\") || \"/\";\n\treturn url.toString().replace(/\\/$/u, \"\");\n}\n\nexport function llamaInferenceUrl(serverUrl: string): string {\n\treturn `${normalizeLlamaServerUrl(serverUrl)}/v1`;\n}\n\nexport class LlamaClient {\n\treadonly serverUrl: string;\n\tprivate readonly apiKey: string | undefined;\n\n\tconstructor(serverUrl: string, apiKey?: string) {\n\t\tthis.serverUrl = normalizeLlamaServerUrl(serverUrl);\n\t\tthis.apiKey = apiKey;\n\t}\n\n\tprivate async request(path: string, init: RequestInit = {}): Promise<unknown> {\n\t\tconst headers = new Headers(init.headers);\n\t\tif (init.body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n\t\tif (this.apiKey) headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\t\tconst timeout = AbortSignal.timeout(15_000);\n\t\tconst signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;\n\t\tconst response = await fetch(`${this.serverUrl}${path}`, { ...init, headers, signal });\n\t\tlet payload: unknown;\n\t\ttry {\n\t\t\tpayload = await response.json();\n\t\t} catch {\n\t\t\tpayload = undefined;\n\t\t}\n\t\tif (!response.ok) throw new Error(errorMessage(payload, `llama.cpp returned HTTP ${response.status}`));\n\t\treturn payload;\n\t}\n\n\tasync list(options: { reload?: boolean; signal?: AbortSignal } = {}): Promise<LlamaModelInfo[]> {\n\t\tconst payload = await this.request(`/models${options.reload ? \"?reload=1\" : \"\"}`, { signal: options.signal });\n\t\tif (typeof payload !== \"object\" || payload === null || !Array.isArray((payload as { data?: unknown }).data)) {\n\t\t\tthrow new Error(\"llama.cpp returned an invalid model catalog\");\n\t\t}\n\t\tconst data = (payload as { data: unknown[] }).data;\n\t\tif (!data.every(isModelInfo)) throw new Error(\"Server is not running in llama.cpp router mode\");\n\t\treturn data;\n\t}\n\n\tasync load(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.request(\"/models/load\", { method: \"POST\", body: JSON.stringify({ model }), signal });\n\t}\n\n\tasync unload(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.request(\"/models/unload\", { method: \"POST\", body: JSON.stringify({ model }), signal });\n\t}\n\n\tasync unloadAndWait(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.unload(model, signal);\n\t\twhile (true) {\n\t\t\tconst entry = (await this.list({ signal })).find((candidate) => candidate.id === model);\n\t\t\tif (!entry || entry.status.value === \"unloaded\") return;\n\t\t\tawait sleep(100, signal);\n\t\t}\n\t}\n\n\tasync download(model: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.request(\"/models\", { method: \"POST\", body: JSON.stringify({ model }), signal });\n\t}\n\n\tasync watch(onEvent: (event: LlamaModelEvent) => void, signal?: AbortSignal): Promise<void> {\n\t\tconst headers = new Headers();\n\t\tif (this.apiKey) headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\t\tconst response = await fetch(`${this.serverUrl}/models/sse`, { headers, signal });\n\t\tif (!response.ok || !response.body) throw new Error(`llama.cpp SSE returned HTTP ${response.status}`);\n\t\tconst reader = response.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tlet buffer = \"\";\n\t\twhile (true) {\n\t\t\tconst chunk = await reader.read();\n\t\t\tif (chunk.done) break;\n\t\t\tbuffer += decoder.decode(chunk.value, { stream: true }).replaceAll(\"\\r\\n\", \"\\n\");\n\t\t\tlet boundary = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (boundary >= 0) {\n\t\t\t\tconst frame = buffer.slice(0, boundary);\n\t\t\t\tbuffer = buffer.slice(boundary + 2);\n\t\t\t\tconst data = frame\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.filter((line) => line.startsWith(\"data:\"))\n\t\t\t\t\t.map((line) => line.slice(5).trimStart())\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tif (data) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst event = JSON.parse(data) as LlamaModelEvent;\n\t\t\t\t\t\tif (event && typeof event.model === \"string\" && typeof event.event === \"string\") onEvent(event);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore malformed events; catalog polling remains authoritative.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tboundary = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync loadAndWait(\n\t\tmodel: string,\n\t\tonProgress: (progress: LlamaProgress) => void,\n\t\tsignal?: AbortSignal,\n\t): Promise<LlamaModelInfo> {\n\t\tconst watcher = new AbortController();\n\t\tconst unlink = linkSignal(signal, watcher);\n\t\tlet eventLoaded = false;\n\t\tlet eventError: string | undefined;\n\t\tvoid this.watch((event) => {\n\t\t\tif (event.model !== model) return;\n\t\t\tif (event.event !== \"model_status\" && event.event !== \"status_change\") return;\n\t\t\tconst data = event.data as { status?: unknown } | undefined;\n\t\t\tif (data?.status === \"loaded\") eventLoaded = true;\n\t\t\tif (data?.status === \"unloaded\") eventError = \"Model failed to load\";\n\t\t\tconst progress = parseLoadProgress(event.data);\n\t\t\tif (progress) onProgress(progress);\n\t\t}, watcher.signal).catch(() => {});\n\t\ttry {\n\t\t\tawait this.load(model, signal);\n\t\t\tonProgress({ message: \"Loading model\" });\n\t\t\twhile (true) {\n\t\t\t\tif (signal?.aborted) throw signal.reason ?? new Error(\"Cancelled\");\n\t\t\t\tconst entry = (await this.list({ signal })).find((candidate) => candidate.id === model);\n\t\t\t\tif (entry?.status.value === \"loaded\") return entry;\n\t\t\t\tif (eventLoaded && !entry) return { id: model, status: { value: \"loaded\" } };\n\t\t\t\tif (entry?.status.failed || eventError) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tentry?.status.exit_code === undefined\n\t\t\t\t\t\t\t? (eventError ?? \"Model failed to load\")\n\t\t\t\t\t\t\t: `Model exited with code ${entry.status.exit_code}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tawait sleep(250, signal);\n\t\t\t}\n\t\t} finally {\n\t\t\tunlink();\n\t\t\twatcher.abort();\n\t\t}\n\t}\n\n\tasync downloadAndWait(\n\t\tmodel: string,\n\t\tonProgress: (progress: LlamaProgress) => void,\n\t\tsignal?: AbortSignal,\n\t): Promise<LlamaModelInfo[]> {\n\t\tconst watcher = new AbortController();\n\t\tconst unlink = linkSignal(signal, watcher);\n\t\tlet finished = false;\n\t\tlet failure: string | undefined;\n\t\tlet sawDownloading = false;\n\t\tlet polls = 0;\n\t\tvoid this.watch((event) => {\n\t\t\tif (event.model !== model) return;\n\t\t\tif (event.event === \"download_finished\") finished = true;\n\t\t\tif (event.event === \"download_failed\") failure = errorMessage(event.data, \"Download failed\");\n\t\t\tif (event.event === \"download_progress\") {\n\t\t\t\tsawDownloading = true;\n\t\t\t\tconst progress = parseDownloadProgress(event.data);\n\t\t\t\tif (progress) onProgress(progress);\n\t\t\t}\n\t\t}, watcher.signal).catch(() => {});\n\t\ttry {\n\t\t\tawait this.download(model, signal);\n\t\t\tonProgress({ message: \"Downloading model\" });\n\t\t\twhile (true) {\n\t\t\t\tif (signal?.aborted) throw signal.reason ?? new Error(\"Cancelled\");\n\t\t\t\tif (failure) throw new Error(failure);\n\t\t\t\tconst models = await this.list({ signal });\n\t\t\t\tpolls++;\n\t\t\t\tconst entry = models.find((candidate) => candidate.id === model);\n\t\t\t\tif (entry?.status.value === \"downloading\") {\n\t\t\t\t\tsawDownloading = true;\n\t\t\t\t\tconst progress = parseDownloadProgress(entry.status.progress);\n\t\t\t\t\tif (progress) onProgress(progress);\n\t\t\t\t} else if (finished || (entry && (sawDownloading || polls >= 2))) {\n\t\t\t\t\treturn this.list({ reload: true, signal });\n\t\t\t\t}\n\t\t\t\tawait sleep(500, signal);\n\t\t\t}\n\t\t} finally {\n\t\t\tunlink();\n\t\t\twatcher.abort();\n\t\t}\n\t}\n}\n"]}
@@ -1,309 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LlamaClient = void 0;
4
- exports.formatBytes = formatBytes;
5
- exports.normalizeLlamaServerUrl = normalizeLlamaServerUrl;
6
- exports.llamaInferenceUrl = llamaInferenceUrl;
7
- function errorMessage(payload, fallback) {
8
- if (typeof payload !== "object" || payload === null)
9
- return fallback;
10
- const error = payload.error;
11
- if (typeof error !== "object" || error === null)
12
- return fallback;
13
- const message = error.message;
14
- return typeof message === "string" && message ? message : fallback;
15
- }
16
- function isModelInfo(value) {
17
- if (typeof value !== "object" || value === null)
18
- return false;
19
- const candidate = value;
20
- return typeof candidate.id === "string" && typeof candidate.status?.value === "string";
21
- }
22
- function linkSignal(source, target) {
23
- if (!source)
24
- return () => { };
25
- if (source.aborted) {
26
- target.abort(source.reason);
27
- return () => { };
28
- }
29
- const abort = () => target.abort(source.reason);
30
- source.addEventListener("abort", abort, { once: true });
31
- return () => source.removeEventListener("abort", abort);
32
- }
33
- function sleep(ms, signal) {
34
- return new Promise((resolve, reject) => {
35
- if (signal?.aborted) {
36
- reject(signal.reason ?? new Error("Cancelled"));
37
- return;
38
- }
39
- const abort = () => {
40
- clearTimeout(timeout);
41
- reject(signal?.reason ?? new Error("Cancelled"));
42
- };
43
- const timeout = setTimeout(() => {
44
- signal?.removeEventListener("abort", abort);
45
- resolve();
46
- }, ms);
47
- signal?.addEventListener("abort", abort, { once: true });
48
- });
49
- }
50
- function parseLoadProgress(data) {
51
- if (typeof data !== "object" || data === null)
52
- return undefined;
53
- const progress = data.progress;
54
- if (typeof progress !== "object" || progress === null)
55
- return undefined;
56
- const value = progress;
57
- const stage = typeof value.current === "string" ? value.current : typeof value.stage === "string" ? value.stage : undefined;
58
- const stages = Array.isArray(value.stages)
59
- ? value.stages.filter((entry) => typeof entry === "string")
60
- : [];
61
- const stageRatio = typeof value.value === "number" ? Math.max(0, Math.min(1, value.value)) : undefined;
62
- let ratio = stageRatio;
63
- if (stage && stages.length > 0) {
64
- const index = stages.indexOf(stage);
65
- if (index >= 0)
66
- ratio = (index + (stageRatio ?? 0)) / stages.length;
67
- }
68
- return {
69
- message: stage ? `Loading ${stage.replaceAll("_", " ")}` : "Loading model",
70
- ratio,
71
- };
72
- }
73
- function parseDownloadProgress(data) {
74
- if (typeof data !== "object" || data === null)
75
- return undefined;
76
- const nested = data.progress;
77
- const files = typeof nested === "object" && nested !== null ? nested : data;
78
- let done = 0;
79
- let total = 0;
80
- for (const value of Object.values(files)) {
81
- if (typeof value !== "object" || value === null)
82
- continue;
83
- const entry = value;
84
- if (typeof entry.done !== "number" || typeof entry.total !== "number")
85
- continue;
86
- done += entry.done;
87
- total += entry.total;
88
- }
89
- if (total <= 0)
90
- return undefined;
91
- return {
92
- message: "Downloading model",
93
- ratio: done / total,
94
- detail: `${formatBytes(done)} / ${formatBytes(total)}`,
95
- };
96
- }
97
- function formatBytes(bytes) {
98
- if (bytes < 1024)
99
- return `${bytes} B`;
100
- const units = ["KiB", "MiB", "GiB", "TiB"];
101
- let value = bytes / 1024;
102
- let unit = units[0];
103
- for (let index = 1; index < units.length && value >= 1024; index++) {
104
- value /= 1024;
105
- unit = units[index];
106
- }
107
- return `${value >= 10 ? value.toFixed(1) : value.toFixed(2)} ${unit}`;
108
- }
109
- function normalizeLlamaServerUrl(value) {
110
- const url = new URL(value.trim());
111
- if (url.protocol !== "http:" && url.protocol !== "https:") {
112
- throw new Error("Server URL must use http or https");
113
- }
114
- url.hash = "";
115
- url.search = "";
116
- url.pathname = url.pathname.replace(/\/+$/u, "").replace(/\/v1$/u, "") || "/";
117
- return url.toString().replace(/\/$/u, "");
118
- }
119
- function llamaInferenceUrl(serverUrl) {
120
- return `${normalizeLlamaServerUrl(serverUrl)}/v1`;
121
- }
122
- class LlamaClient {
123
- serverUrl;
124
- apiKey;
125
- constructor(serverUrl, apiKey) {
126
- this.serverUrl = normalizeLlamaServerUrl(serverUrl);
127
- this.apiKey = apiKey;
128
- }
129
- async request(path, init = {}) {
130
- const headers = new Headers(init.headers);
131
- if (init.body !== undefined)
132
- headers.set("Content-Type", "application/json");
133
- if (this.apiKey)
134
- headers.set("Authorization", `Bearer ${this.apiKey}`);
135
- const timeout = AbortSignal.timeout(15_000);
136
- const signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
137
- const response = await fetch(`${this.serverUrl}${path}`, { ...init, headers, signal });
138
- let payload;
139
- try {
140
- payload = await response.json();
141
- }
142
- catch {
143
- payload = undefined;
144
- }
145
- if (!response.ok)
146
- throw new Error(errorMessage(payload, `llama.cpp returned HTTP ${response.status}`));
147
- return payload;
148
- }
149
- async list(options = {}) {
150
- const payload = await this.request(`/models${options.reload ? "?reload=1" : ""}`, { signal: options.signal });
151
- if (typeof payload !== "object" || payload === null || !Array.isArray(payload.data)) {
152
- throw new Error("llama.cpp returned an invalid model catalog");
153
- }
154
- const data = payload.data;
155
- if (!data.every(isModelInfo))
156
- throw new Error("Server is not running in llama.cpp router mode");
157
- return data;
158
- }
159
- async load(model, signal) {
160
- await this.request("/models/load", { method: "POST", body: JSON.stringify({ model }), signal });
161
- }
162
- async unload(model, signal) {
163
- await this.request("/models/unload", { method: "POST", body: JSON.stringify({ model }), signal });
164
- }
165
- async unloadAndWait(model, signal) {
166
- await this.unload(model, signal);
167
- while (true) {
168
- const entry = (await this.list({ signal })).find((candidate) => candidate.id === model);
169
- if (!entry || entry.status.value === "unloaded")
170
- return;
171
- await sleep(100, signal);
172
- }
173
- }
174
- async download(model, signal) {
175
- await this.request("/models", { method: "POST", body: JSON.stringify({ model }), signal });
176
- }
177
- async watch(onEvent, signal) {
178
- const headers = new Headers();
179
- if (this.apiKey)
180
- headers.set("Authorization", `Bearer ${this.apiKey}`);
181
- const response = await fetch(`${this.serverUrl}/models/sse`, { headers, signal });
182
- if (!response.ok || !response.body)
183
- throw new Error(`llama.cpp SSE returned HTTP ${response.status}`);
184
- const reader = response.body.getReader();
185
- const decoder = new TextDecoder();
186
- let buffer = "";
187
- while (true) {
188
- const chunk = await reader.read();
189
- if (chunk.done)
190
- break;
191
- buffer += decoder.decode(chunk.value, { stream: true }).replaceAll("\r\n", "\n");
192
- let boundary = buffer.indexOf("\n\n");
193
- while (boundary >= 0) {
194
- const frame = buffer.slice(0, boundary);
195
- buffer = buffer.slice(boundary + 2);
196
- const data = frame
197
- .split("\n")
198
- .filter((line) => line.startsWith("data:"))
199
- .map((line) => line.slice(5).trimStart())
200
- .join("\n");
201
- if (data) {
202
- try {
203
- const event = JSON.parse(data);
204
- if (event && typeof event.model === "string" && typeof event.event === "string")
205
- onEvent(event);
206
- }
207
- catch {
208
- // Ignore malformed events; catalog polling remains authoritative.
209
- }
210
- }
211
- boundary = buffer.indexOf("\n\n");
212
- }
213
- }
214
- }
215
- async loadAndWait(model, onProgress, signal) {
216
- const watcher = new AbortController();
217
- const unlink = linkSignal(signal, watcher);
218
- let eventLoaded = false;
219
- let eventError;
220
- void this.watch((event) => {
221
- if (event.model !== model)
222
- return;
223
- if (event.event !== "model_status" && event.event !== "status_change")
224
- return;
225
- const data = event.data;
226
- if (data?.status === "loaded")
227
- eventLoaded = true;
228
- if (data?.status === "unloaded")
229
- eventError = "Model failed to load";
230
- const progress = parseLoadProgress(event.data);
231
- if (progress)
232
- onProgress(progress);
233
- }, watcher.signal).catch(() => { });
234
- try {
235
- await this.load(model, signal);
236
- onProgress({ message: "Loading model" });
237
- while (true) {
238
- if (signal?.aborted)
239
- throw signal.reason ?? new Error("Cancelled");
240
- const entry = (await this.list({ signal })).find((candidate) => candidate.id === model);
241
- if (entry?.status.value === "loaded")
242
- return entry;
243
- if (eventLoaded && !entry)
244
- return { id: model, status: { value: "loaded" } };
245
- if (entry?.status.failed || eventError) {
246
- throw new Error(entry?.status.exit_code === undefined
247
- ? (eventError ?? "Model failed to load")
248
- : `Model exited with code ${entry.status.exit_code}`);
249
- }
250
- await sleep(250, signal);
251
- }
252
- }
253
- finally {
254
- unlink();
255
- watcher.abort();
256
- }
257
- }
258
- async downloadAndWait(model, onProgress, signal) {
259
- const watcher = new AbortController();
260
- const unlink = linkSignal(signal, watcher);
261
- let finished = false;
262
- let failure;
263
- let sawDownloading = false;
264
- let polls = 0;
265
- void this.watch((event) => {
266
- if (event.model !== model)
267
- return;
268
- if (event.event === "download_finished")
269
- finished = true;
270
- if (event.event === "download_failed")
271
- failure = errorMessage(event.data, "Download failed");
272
- if (event.event === "download_progress") {
273
- sawDownloading = true;
274
- const progress = parseDownloadProgress(event.data);
275
- if (progress)
276
- onProgress(progress);
277
- }
278
- }, watcher.signal).catch(() => { });
279
- try {
280
- await this.download(model, signal);
281
- onProgress({ message: "Downloading model" });
282
- while (true) {
283
- if (signal?.aborted)
284
- throw signal.reason ?? new Error("Cancelled");
285
- if (failure)
286
- throw new Error(failure);
287
- const models = await this.list({ signal });
288
- polls++;
289
- const entry = models.find((candidate) => candidate.id === model);
290
- if (entry?.status.value === "downloading") {
291
- sawDownloading = true;
292
- const progress = parseDownloadProgress(entry.status.progress);
293
- if (progress)
294
- onProgress(progress);
295
- }
296
- else if (finished || (entry && (sawDownloading || polls >= 2))) {
297
- return this.list({ reload: true, signal });
298
- }
299
- await sleep(500, signal);
300
- }
301
- }
302
- finally {
303
- unlink();
304
- watcher.abort();
305
- }
306
- }
307
- }
308
- exports.LlamaClient = LlamaClient;
309
- //# sourceMappingURL=client.js.map