brainctl 0.1.17 → 0.1.18
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.d.ts +4 -6
- package/dist/cli.js +11 -16
- package/dist/commands/profile.d.ts +4 -0
- package/dist/commands/profile.js +106 -16
- package/dist/commands/status.js +7 -7
- package/dist/mcp/server.js +48 -141
- package/dist/services/agent-asset-installer.d.ts +3 -0
- package/dist/services/agent-asset-installer.js +109 -0
- package/dist/services/agent-availability-service.d.ts +11 -0
- package/dist/services/agent-availability-service.js +32 -0
- package/dist/services/credential-redaction-service.d.ts +1 -0
- package/dist/services/credential-redaction-service.js +9 -3
- package/dist/services/doctor-service.d.ts +2 -2
- package/dist/services/doctor-service.js +7 -63
- package/dist/services/portable-profile-pack-service.d.ts +6 -0
- package/dist/services/portable-profile-pack-service.js +78 -4
- package/dist/services/profile-apply-service.d.ts +34 -0
- package/dist/services/profile-apply-service.js +102 -0
- package/dist/services/profile-export-service.d.ts +5 -1
- package/dist/services/profile-export-service.js +3 -1
- package/dist/services/profile-import-service.js +82 -127
- package/dist/services/profile-service.d.ts +3 -11
- package/dist/services/profile-service.js +57 -102
- package/dist/services/profile-snapshot-service.d.ts +12 -0
- package/dist/services/profile-snapshot-service.js +47 -0
- package/dist/services/status-service.d.ts +9 -7
- package/dist/services/status-service.js +14 -13
- package/dist/types.d.ts +2 -57
- package/dist/ui/routes.d.ts +0 -2
- package/dist/ui/routes.js +71 -120
- package/dist/web/assets/index-CGmTbSgk.js +63 -0
- package/dist/web/assets/index-EIVU5Woh.css +2 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.js +0 -27
- package/dist/commands/run.d.ts +0 -3
- package/dist/commands/run.js +0 -25
- package/dist/commands/sync.d.ts +0 -3
- package/dist/commands/sync.js +0 -31
- package/dist/config.d.ts +0 -14
- package/dist/config.js +0 -96
- package/dist/context/builder.d.ts +0 -6
- package/dist/context/builder.js +0 -13
- package/dist/context/memory.d.ts +0 -5
- package/dist/context/memory.js +0 -43
- package/dist/context/skills.d.ts +0 -2
- package/dist/context/skills.js +0 -8
- package/dist/executor/claude.d.ts +0 -12
- package/dist/executor/claude.js +0 -16
- package/dist/executor/codex.d.ts +0 -12
- package/dist/executor/codex.js +0 -16
- package/dist/executor/process.d.ts +0 -11
- package/dist/executor/process.js +0 -40
- package/dist/executor/resolver.d.ts +0 -13
- package/dist/executor/resolver.js +0 -60
- package/dist/executor/types.d.ts +0 -14
- package/dist/executor/types.js +0 -1
- package/dist/services/config-write-service.d.ts +0 -12
- package/dist/services/config-write-service.js +0 -70
- package/dist/services/init-service.d.ts +0 -14
- package/dist/services/init-service.js +0 -88
- package/dist/services/memory-write-service.d.ts +0 -12
- package/dist/services/memory-write-service.js +0 -56
- package/dist/services/run-service.d.ts +0 -15
- package/dist/services/run-service.js +0 -94
- package/dist/services/sync-service.d.ts +0 -15
- package/dist/services/sync-service.js +0 -69
- package/dist/ui/streaming.d.ts +0 -3
- package/dist/ui/streaming.js +0 -16
- package/dist/web/assets/index-Bbophmwh.css +0 -2
- package/dist/web/assets/index-DDG_ylui.js +0 -63
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-700:oklch(50% .134 242.749);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-700:oklch(45.7% .24 277.023);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-700:oklch(49.1% .27 292.581);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.top-6{top:calc(var(--spacing) * 6)}.top-full{top:100%}.left-1\/2{left:50%}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-m-4{margin:calc(var(--spacing) * -4)}.m-0{margin:calc(var(--spacing) * 0)}.m-3{margin:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-full{width:100%;height:100%}.h-0{height:calc(var(--spacing) * 0)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[36px\]{min-height:36px}.min-h-\[120px\]{min-height:120px}.min-h-screen{min-height:100vh}.w-72{width:calc(var(--spacing) * 72)}.w-full{width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[28px\]{min-width:28px}.flex-1{flex:1}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-2{rotate:2deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[ping_400ms_ease-out_1\]{animation:.4s ease-out ping}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-300{border-color:var(--color-emerald-300)}.border-indigo-200{border-color:var(--color-indigo-200)}.border-red-200{border-color:var(--color-red-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-sky-200{border-color:var(--color-sky-200)}.border-transparent{border-color:#0000}.border-violet-200{border-color:var(--color-violet-200)}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-200\/60{border-color:#e4e4e799}@supports (color:color-mix(in lab, red, red)){.border-zinc-200\/60{border-color:color-mix(in oklab, var(--color-zinc-200) 60%, transparent)}}.border-zinc-200\/80{border-color:#e4e4e7cc}@supports (color:color-mix(in lab, red, red)){.border-zinc-200\/80{border-color:color-mix(in oklab, var(--color-zinc-200) 80%, transparent)}}.border-zinc-300{border-color:var(--color-zinc-300)}.bg-\[\#fcfcfc\]{background-color:#fcfcfc}.bg-amber-50{background-color:var(--color-amber-50)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-50\/40{background-color:#ecfdf566}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/40{background-color:color-mix(in oklab, var(--color-emerald-50) 40%, transparent)}}.bg-emerald-50\/50{background-color:#ecfdf580}@supports (color:color-mix(in lab, red, red)){.bg-emerald-50\/50{background-color:color-mix(in oklab, var(--color-emerald-50) 50%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-50\/40{background-color:#fff1f266}@supports (color:color-mix(in lab, red, red)){.bg-rose-50\/40{background-color:color-mix(in oklab, var(--color-rose-50) 40%, transparent)}}.bg-rose-100{background-color:var(--color-rose-100)}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-50\/50{background-color:#fafafa80}@supports (color:color-mix(in lab, red, red)){.bg-zinc-50\/50{background-color:color-mix(in oklab, var(--color-zinc-50) 50%, transparent)}}.bg-zinc-50\/60{background-color:#fafafa99}@supports (color:color-mix(in lab, red, red)){.bg-zinc-50\/60{background-color:color-mix(in oklab, var(--color-zinc-50) 60%, transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-900{background-color:var(--color-zinc-900)}.object-contain{object-fit:contain}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-0{padding-bottom:calc(var(--spacing) * 0)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-amber-700{color:var(--color-amber-700)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-indigo-700{color:var(--color-indigo-700)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-900{color:var(--color-red-900)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-sky-700{color:var(--color-sky-700)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(16\,185\,129\,0\.15\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#10b98126);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-emerald-400\/20{--tw-ring-color:#00d29433}@supports (color:color-mix(in lab, red, red)){.ring-emerald-400\/20{--tw-ring-color:color-mix(in oklab, var(--color-emerald-400) 20%, transparent)}}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-zinc-200\/50{--tw-ring-color:#e4e4e780}@supports (color:color-mix(in lab, red, red)){.ring-zinc-200\/50{--tw-ring-color:color-mix(in oklab, var(--color-zinc-200) 50%, transparent)}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:text-zinc-900:is(:where(.group):hover *){color:var(--color-zinc-900)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:border-zinc-200:hover{border-color:var(--color-zinc-200)}.hover\:border-zinc-300:hover{border-color:var(--color-zinc-300)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:opacity-50:disabled{opacity:.5}@media (width>=40rem){.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media (width>=64rem){.lg\:flex{display:flex}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:justify-between{justify-content:space-between}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.lg\:p-6{padding:calc(var(--spacing) * 6)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:py-0{padding-block:calc(var(--spacing) * 0)}.lg\:pr-0{padding-right:calc(var(--spacing) * 0)}.lg\:pr-10{padding-right:calc(var(--spacing) * 10)}.lg\:pl-0{padding-left:calc(var(--spacing) * 0)}.lg\:pl-10{padding-left:calc(var(--spacing) * 10)}}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--background:#fff;--foreground:#09090b}html,body,#root{background-color:var(--background);min-height:100vh;color:var(--foreground);margin:0;padding:0}body,button,input,select,textarea{letter-spacing:-.01em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Avenir Next,Helvetica Neue,Segoe UI,SF Pro Text,Arial,sans-serif}code{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Consolas,Liberation Mono,monospace}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}
|
package/dist/web/index.html
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="/favicon-light.svg" media="(prefers-color-scheme: dark)" />
|
|
8
8
|
<title>brainctl | Local Control Panel</title>
|
|
9
9
|
<meta name="description" content="A local control panel for inspecting brainctl configuration, memory, skills, and agents." />
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-CGmTbSgk.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/assets/index-EIVU5Woh.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="root"></div>
|
package/package.json
CHANGED
package/dist/commands/init.d.ts
DELETED
package/dist/commands/init.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import pc from 'picocolors';
|
|
2
|
-
export function registerInitCommand(program, initService) {
|
|
3
|
-
program
|
|
4
|
-
.command('init')
|
|
5
|
-
.description('Initialize brainctl in the current directory')
|
|
6
|
-
.option('--force', 'Overwrite existing scaffolded files')
|
|
7
|
-
.action(async (options) => {
|
|
8
|
-
const result = await initService.execute({
|
|
9
|
-
cwd: process.cwd(),
|
|
10
|
-
force: options.force
|
|
11
|
-
});
|
|
12
|
-
if (result.alreadyInitialized) {
|
|
13
|
-
console.log('brainctl is already initialized in this directory');
|
|
14
|
-
console.log('Use --force to overwrite existing files.');
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
for (const item of result.created) {
|
|
18
|
-
console.log(pc.green(`created ${item}`));
|
|
19
|
-
}
|
|
20
|
-
for (const item of result.replaced) {
|
|
21
|
-
console.log(pc.yellow(`replaced ${item}`));
|
|
22
|
-
}
|
|
23
|
-
if (result.created.length === 0 && result.replaced.length === 0) {
|
|
24
|
-
console.log('No changes were required.');
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
package/dist/commands/run.d.ts
DELETED
package/dist/commands/run.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export function registerRunCommand(program, runService) {
|
|
2
|
-
program
|
|
3
|
-
.command('run')
|
|
4
|
-
.description('Run a file through a configured skill and AI agent')
|
|
5
|
-
.argument('<skill>', 'Skill name from ai-stack.yaml')
|
|
6
|
-
.argument('<file>', 'Input file to send to the agent')
|
|
7
|
-
.requiredOption('--with <agent>', 'Primary agent to run', validateAgentName)
|
|
8
|
-
.option('--fallback <agent>', 'Fallback agent if the primary agent is unavailable', validateAgentName)
|
|
9
|
-
.action(async (skill, inputFile, options) => {
|
|
10
|
-
const trace = await runService.execute({
|
|
11
|
-
cwd: process.cwd(),
|
|
12
|
-
skill,
|
|
13
|
-
inputFile,
|
|
14
|
-
primaryAgent: options.with,
|
|
15
|
-
fallbackAgent: options.fallback
|
|
16
|
-
});
|
|
17
|
-
process.exitCode = trace.finalExitCode;
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
function validateAgentName(value) {
|
|
21
|
-
if (value !== 'claude' && value !== 'codex') {
|
|
22
|
-
throw new Error(`Unsupported agent: ${value}`);
|
|
23
|
-
}
|
|
24
|
-
return value;
|
|
25
|
-
}
|
package/dist/commands/sync.d.ts
DELETED
package/dist/commands/sync.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import pc from 'picocolors';
|
|
2
|
-
export function registerSyncCommand(program, syncService) {
|
|
3
|
-
program
|
|
4
|
-
.command('sync')
|
|
5
|
-
.description('Sync active profile to agent configs')
|
|
6
|
-
.option('--restore', 'Restore agent configs from most recent backup')
|
|
7
|
-
.action(async (options) => {
|
|
8
|
-
const results = await syncService.execute({
|
|
9
|
-
cwd: process.cwd(),
|
|
10
|
-
restore: options.restore,
|
|
11
|
-
});
|
|
12
|
-
if (results.length === 0) {
|
|
13
|
-
console.log('No agents to sync.');
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
if (options.restore) {
|
|
17
|
-
console.log(pc.bold('Restored agent configs:'));
|
|
18
|
-
for (const result of results) {
|
|
19
|
-
console.log(` ${result.agent}: restored from ${result.configPath}`);
|
|
20
|
-
}
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
console.log(pc.bold('Synced profile to agents:'));
|
|
24
|
-
for (const result of results) {
|
|
25
|
-
console.log(` ${result.agent}: ${result.configPath} (${result.mcpCount} MCPs)`);
|
|
26
|
-
if (result.backedUpTo) {
|
|
27
|
-
console.log(` backed up to ${result.backedUpTo}`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
package/dist/config.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { BrainctlConfig, SkillConfig } from './types.js';
|
|
2
|
-
interface LoadConfigOptions {
|
|
3
|
-
cwd?: string;
|
|
4
|
-
}
|
|
5
|
-
export interface ConfigPayload {
|
|
6
|
-
memory: {
|
|
7
|
-
paths: string[];
|
|
8
|
-
};
|
|
9
|
-
skills: Record<string, SkillConfig>;
|
|
10
|
-
mcps: Record<string, unknown>;
|
|
11
|
-
}
|
|
12
|
-
export declare function loadConfig(options?: LoadConfigOptions): Promise<BrainctlConfig>;
|
|
13
|
-
export declare function parseConfigPayload(value: unknown): ConfigPayload;
|
|
14
|
-
export {};
|
package/dist/config.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import YAML from 'yaml';
|
|
4
|
-
import { ConfigError } from './errors.js';
|
|
5
|
-
export async function loadConfig(options = {}) {
|
|
6
|
-
const cwd = options.cwd ?? process.cwd();
|
|
7
|
-
const configPath = path.join(cwd, 'ai-stack.yaml');
|
|
8
|
-
let source;
|
|
9
|
-
try {
|
|
10
|
-
source = await readFile(configPath, 'utf8');
|
|
11
|
-
}
|
|
12
|
-
catch (error) {
|
|
13
|
-
throw new ConfigError(`Could not read ai-stack.yaml in ${cwd}.`);
|
|
14
|
-
}
|
|
15
|
-
let parsed;
|
|
16
|
-
try {
|
|
17
|
-
parsed = YAML.parse(source) ?? {};
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
throw new ConfigError('ai-stack.yaml could not be parsed.');
|
|
21
|
-
}
|
|
22
|
-
const config = parseConfigPayload(parsed);
|
|
23
|
-
return {
|
|
24
|
-
configPath,
|
|
25
|
-
rootDir: cwd,
|
|
26
|
-
memory: {
|
|
27
|
-
paths: config.memory.paths.map((memoryPath) => {
|
|
28
|
-
if (typeof memoryPath !== 'string' || memoryPath.trim().length === 0) {
|
|
29
|
-
throw new ConfigError('ai-stack.yaml contains an invalid memory path.');
|
|
30
|
-
}
|
|
31
|
-
return path.resolve(cwd, memoryPath);
|
|
32
|
-
})
|
|
33
|
-
},
|
|
34
|
-
skills: config.skills,
|
|
35
|
-
mcps: config.mcps
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
export function parseConfigPayload(value) {
|
|
39
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
40
|
-
throw new ConfigError('ai-stack.yaml is missing the required "memory.paths" section.');
|
|
41
|
-
}
|
|
42
|
-
const parsed = value;
|
|
43
|
-
if (!parsed.memory || !Array.isArray(parsed.memory.paths)) {
|
|
44
|
-
throw new ConfigError('ai-stack.yaml is missing the required "memory.paths" section.');
|
|
45
|
-
}
|
|
46
|
-
if (!parsed.skills || typeof parsed.skills !== 'object' || Array.isArray(parsed.skills)) {
|
|
47
|
-
throw new ConfigError('ai-stack.yaml is missing the required "skills" section.');
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
memory: {
|
|
51
|
-
paths: parsed.memory.paths.map((memoryPath) => {
|
|
52
|
-
if (typeof memoryPath !== 'string' || memoryPath.trim().length === 0) {
|
|
53
|
-
throw new ConfigError('ai-stack.yaml contains an invalid memory path.');
|
|
54
|
-
}
|
|
55
|
-
return memoryPath;
|
|
56
|
-
})
|
|
57
|
-
},
|
|
58
|
-
skills: normalizeSkills(parsed.skills),
|
|
59
|
-
mcps: normalizeMcps(parsed.mcps)
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function normalizeSkills(value) {
|
|
63
|
-
const entries = Object.entries(value);
|
|
64
|
-
if (entries.length === 0) {
|
|
65
|
-
throw new ConfigError('ai-stack.yaml must define at least one skill.');
|
|
66
|
-
}
|
|
67
|
-
return Object.fromEntries(entries.map(([name, skillValue]) => {
|
|
68
|
-
if (!skillValue || typeof skillValue !== 'object' || Array.isArray(skillValue)) {
|
|
69
|
-
throw new ConfigError(`Skill "${name}" must be an object with a prompt.`);
|
|
70
|
-
}
|
|
71
|
-
const prompt = skillValue.prompt;
|
|
72
|
-
const description = skillValue.description;
|
|
73
|
-
if (typeof prompt !== 'string' || prompt.trim().length === 0) {
|
|
74
|
-
throw new ConfigError(`Skill "${name}" is missing a valid prompt.`);
|
|
75
|
-
}
|
|
76
|
-
if (description !== undefined && typeof description !== 'string') {
|
|
77
|
-
throw new ConfigError(`Skill "${name}" has an invalid description.`);
|
|
78
|
-
}
|
|
79
|
-
return [
|
|
80
|
-
name,
|
|
81
|
-
{
|
|
82
|
-
prompt,
|
|
83
|
-
description
|
|
84
|
-
}
|
|
85
|
-
];
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
function normalizeMcps(value) {
|
|
89
|
-
if (value === null || value === undefined) {
|
|
90
|
-
return {};
|
|
91
|
-
}
|
|
92
|
-
if (typeof value !== 'object' || Array.isArray(value)) {
|
|
93
|
-
throw new ConfigError('The "mcps" section must be an object when present.');
|
|
94
|
-
}
|
|
95
|
-
return value;
|
|
96
|
-
}
|
package/dist/context/builder.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export function buildContext({ memory, skill, input }) {
|
|
2
|
-
const sections = [memory, skill, input].map((value) => value.replace(/\n+$/, ''));
|
|
3
|
-
return [
|
|
4
|
-
'--- MEMORY ---',
|
|
5
|
-
sections[0],
|
|
6
|
-
'',
|
|
7
|
-
'--- SKILL ---',
|
|
8
|
-
sections[1],
|
|
9
|
-
'',
|
|
10
|
-
'--- INPUT ---',
|
|
11
|
-
sections[2]
|
|
12
|
-
].join('\n');
|
|
13
|
-
}
|
package/dist/context/memory.d.ts
DELETED
package/dist/context/memory.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { MemoryPathError } from '../errors.js';
|
|
4
|
-
export async function loadMemory(options) {
|
|
5
|
-
const markdownFiles = (await Promise.all(options.paths.map(async (memoryPath) => collectMarkdownFiles(memoryPath))))
|
|
6
|
-
.flat()
|
|
7
|
-
.sort((left, right) => left.localeCompare(right));
|
|
8
|
-
const entries = await Promise.all(markdownFiles.map(async (filePath) => ({
|
|
9
|
-
path: filePath,
|
|
10
|
-
content: await readFile(filePath, 'utf8')
|
|
11
|
-
})));
|
|
12
|
-
const contents = entries.map((entry) => entry.content.trim());
|
|
13
|
-
return {
|
|
14
|
-
files: markdownFiles,
|
|
15
|
-
count: markdownFiles.length,
|
|
16
|
-
content: contents.filter((entry) => entry.length > 0).join('\n\n'),
|
|
17
|
-
entries
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
async function collectMarkdownFiles(targetPath) {
|
|
21
|
-
let targetStats;
|
|
22
|
-
try {
|
|
23
|
-
targetStats = await stat(targetPath);
|
|
24
|
-
}
|
|
25
|
-
catch (error) {
|
|
26
|
-
throw new MemoryPathError(`Memory path does not exist: ${targetPath}`);
|
|
27
|
-
}
|
|
28
|
-
if (!targetStats.isDirectory()) {
|
|
29
|
-
throw new MemoryPathError(`Memory path is not a directory: ${targetPath}`);
|
|
30
|
-
}
|
|
31
|
-
const entries = await readdir(targetPath, { withFileTypes: true });
|
|
32
|
-
const nestedResults = await Promise.all(entries.map(async (entry) => {
|
|
33
|
-
const entryPath = path.join(targetPath, entry.name);
|
|
34
|
-
if (entry.isDirectory()) {
|
|
35
|
-
return collectMarkdownFiles(entryPath);
|
|
36
|
-
}
|
|
37
|
-
if (entry.isFile() && path.extname(entry.name).toLowerCase() === '.md') {
|
|
38
|
-
return [entryPath];
|
|
39
|
-
}
|
|
40
|
-
return [];
|
|
41
|
-
}));
|
|
42
|
-
return nestedResults.flat();
|
|
43
|
-
}
|
package/dist/context/skills.d.ts
DELETED
package/dist/context/skills.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { SkillNotFoundError } from '../errors.js';
|
|
2
|
-
export function resolveSkillPrompt(config, skillName) {
|
|
3
|
-
const skill = config.skills[skillName];
|
|
4
|
-
if (!skill) {
|
|
5
|
-
throw new SkillNotFoundError(`Skill "${skillName}" is not defined in ai-stack.yaml.`);
|
|
6
|
-
}
|
|
7
|
-
return skill.prompt;
|
|
8
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Executor, ExecutorRunOptions, ExecutorResult } from './types.js';
|
|
2
|
-
export declare function createClaudeInvocation(context: string, options?: ExecutorRunOptions): {
|
|
3
|
-
command: string;
|
|
4
|
-
args: string[];
|
|
5
|
-
agent: "claude";
|
|
6
|
-
context: string;
|
|
7
|
-
runOptions: ExecutorRunOptions | undefined;
|
|
8
|
-
};
|
|
9
|
-
export declare class ClaudeExecutor implements Executor {
|
|
10
|
-
readonly agent: "claude";
|
|
11
|
-
run(context: string, options?: ExecutorRunOptions): Promise<ExecutorResult>;
|
|
12
|
-
}
|
package/dist/executor/claude.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { runAgentProcess } from './process.js';
|
|
2
|
-
export function createClaudeInvocation(context, options) {
|
|
3
|
-
return {
|
|
4
|
-
command: 'claude',
|
|
5
|
-
args: ['-p'],
|
|
6
|
-
agent: 'claude',
|
|
7
|
-
context,
|
|
8
|
-
runOptions: options
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export class ClaudeExecutor {
|
|
12
|
-
agent = 'claude';
|
|
13
|
-
async run(context, options) {
|
|
14
|
-
return await runAgentProcess(createClaudeInvocation(context, options));
|
|
15
|
-
}
|
|
16
|
-
}
|
package/dist/executor/codex.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Executor, ExecutorRunOptions, ExecutorResult } from './types.js';
|
|
2
|
-
export declare function createCodexInvocation(context: string, options?: ExecutorRunOptions): {
|
|
3
|
-
command: string;
|
|
4
|
-
args: string[];
|
|
5
|
-
agent: "codex";
|
|
6
|
-
context: string;
|
|
7
|
-
runOptions: ExecutorRunOptions | undefined;
|
|
8
|
-
};
|
|
9
|
-
export declare class CodexExecutor implements Executor {
|
|
10
|
-
readonly agent: "codex";
|
|
11
|
-
run(context: string, options?: ExecutorRunOptions): Promise<ExecutorResult>;
|
|
12
|
-
}
|
package/dist/executor/codex.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { runAgentProcess } from './process.js';
|
|
2
|
-
export function createCodexInvocation(context, options) {
|
|
3
|
-
return {
|
|
4
|
-
command: 'codex',
|
|
5
|
-
args: ['exec', '--skip-git-repo-check', '-'],
|
|
6
|
-
agent: 'codex',
|
|
7
|
-
context,
|
|
8
|
-
runOptions: options
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export class CodexExecutor {
|
|
12
|
-
agent = 'codex';
|
|
13
|
-
async run(context, options) {
|
|
14
|
-
return await runAgentProcess(createCodexInvocation(context, options));
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { AgentName } from '../types.js';
|
|
2
|
-
import type { ExecutorResult, ExecutorRunOptions } from './types.js';
|
|
3
|
-
interface RunAgentProcessOptions {
|
|
4
|
-
command: string;
|
|
5
|
-
args?: string[];
|
|
6
|
-
agent: AgentName;
|
|
7
|
-
context: string;
|
|
8
|
-
runOptions?: ExecutorRunOptions;
|
|
9
|
-
}
|
|
10
|
-
export declare function runAgentProcess(options: RunAgentProcessOptions): Promise<ExecutorResult>;
|
|
11
|
-
export {};
|
package/dist/executor/process.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { ExecutionError } from '../errors.js';
|
|
3
|
-
export async function runAgentProcess(options) {
|
|
4
|
-
return await new Promise((resolve, reject) => {
|
|
5
|
-
const child = spawn(options.command, options.args ?? [], {
|
|
6
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
7
|
-
});
|
|
8
|
-
let output = '';
|
|
9
|
-
child.stdout.on('data', (chunk) => {
|
|
10
|
-
const text = chunk.toString();
|
|
11
|
-
output += text;
|
|
12
|
-
options.runOptions?.onOutputChunk?.(text);
|
|
13
|
-
if (options.runOptions?.streamOutput !== false) {
|
|
14
|
-
process.stdout.write(chunk);
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
child.stderr.on('data', (chunk) => {
|
|
18
|
-
const text = chunk.toString();
|
|
19
|
-
output += text;
|
|
20
|
-
options.runOptions?.onOutputChunk?.(text);
|
|
21
|
-
if (options.runOptions?.streamOutput !== false) {
|
|
22
|
-
process.stderr.write(chunk);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
child.on('error', (error) => {
|
|
26
|
-
reject(new ExecutionError(`Failed to start ${options.agent}: ${error.message}`));
|
|
27
|
-
});
|
|
28
|
-
child.on('close', (code) => {
|
|
29
|
-
resolve({
|
|
30
|
-
output,
|
|
31
|
-
exitCode: code ?? 1,
|
|
32
|
-
agent: options.agent
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
child.stdin.on('error', () => {
|
|
36
|
-
// Ignore broken-pipe behavior if the child exits before stdin completes.
|
|
37
|
-
});
|
|
38
|
-
child.stdin.end(options.context);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { AgentName } from '../types.js';
|
|
2
|
-
import type { Executor } from './types.js';
|
|
3
|
-
export interface AgentAvailability {
|
|
4
|
-
agent: AgentName;
|
|
5
|
-
available: boolean;
|
|
6
|
-
command: string;
|
|
7
|
-
resolvedPath?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface ExecutorResolver {
|
|
10
|
-
resolveExecutor(agentName: AgentName): Promise<Executor>;
|
|
11
|
-
getAgentAvailability(): Promise<Record<AgentName, AgentAvailability>>;
|
|
12
|
-
}
|
|
13
|
-
export declare function createExecutorResolver(): ExecutorResolver;
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { AgentNotAvailableError } from '../errors.js';
|
|
2
|
-
import { ClaudeExecutor } from './claude.js';
|
|
3
|
-
import { CodexExecutor } from './codex.js';
|
|
4
|
-
import { findExecutable } from '../system/executables.js';
|
|
5
|
-
const SUPPORTED_AGENTS = ['claude', 'codex', 'gemini'];
|
|
6
|
-
const AGENT_COMMANDS = {
|
|
7
|
-
claude: 'claude',
|
|
8
|
-
codex: 'codex',
|
|
9
|
-
gemini: 'gemini'
|
|
10
|
-
};
|
|
11
|
-
class DefaultExecutorResolver {
|
|
12
|
-
availabilityCache = new Map();
|
|
13
|
-
executorCache = new Map();
|
|
14
|
-
async resolveExecutor(agentName) {
|
|
15
|
-
const availability = await this.getAvailabilityForAgent(agentName);
|
|
16
|
-
if (!availability.available) {
|
|
17
|
-
throw new AgentNotAvailableError(`Agent "${agentName}" is not available on PATH.`);
|
|
18
|
-
}
|
|
19
|
-
if (!this.executorCache.has(agentName)) {
|
|
20
|
-
this.executorCache.set(agentName, createExecutor(agentName));
|
|
21
|
-
}
|
|
22
|
-
return this.executorCache.get(agentName);
|
|
23
|
-
}
|
|
24
|
-
async getAgentAvailability() {
|
|
25
|
-
const checks = await Promise.all(SUPPORTED_AGENTS.map(async (agentName) => [
|
|
26
|
-
agentName,
|
|
27
|
-
await this.getAvailabilityForAgent(agentName)
|
|
28
|
-
]));
|
|
29
|
-
return Object.fromEntries(checks);
|
|
30
|
-
}
|
|
31
|
-
async getAvailabilityForAgent(agentName) {
|
|
32
|
-
if (!this.availabilityCache.has(agentName)) {
|
|
33
|
-
this.availabilityCache.set(agentName, checkAvailability(agentName));
|
|
34
|
-
}
|
|
35
|
-
return await this.availabilityCache.get(agentName);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
export function createExecutorResolver() {
|
|
39
|
-
return new DefaultExecutorResolver();
|
|
40
|
-
}
|
|
41
|
-
function createExecutor(agentName) {
|
|
42
|
-
switch (agentName) {
|
|
43
|
-
case 'claude':
|
|
44
|
-
return new ClaudeExecutor();
|
|
45
|
-
case 'codex':
|
|
46
|
-
return new CodexExecutor();
|
|
47
|
-
default:
|
|
48
|
-
throw new AgentNotAvailableError(`Agent "${agentName}" does not have an executor implementation.`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async function checkAvailability(agentName) {
|
|
52
|
-
const command = AGENT_COMMANDS[agentName];
|
|
53
|
-
const resolvedPath = await findExecutable(command);
|
|
54
|
-
return {
|
|
55
|
-
agent: agentName,
|
|
56
|
-
command,
|
|
57
|
-
available: resolvedPath !== null,
|
|
58
|
-
resolvedPath: resolvedPath ?? undefined
|
|
59
|
-
};
|
|
60
|
-
}
|
package/dist/executor/types.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { AgentName } from '../types.js';
|
|
2
|
-
export interface ExecutorRunOptions {
|
|
3
|
-
streamOutput?: boolean;
|
|
4
|
-
onOutputChunk?: (chunk: string) => void;
|
|
5
|
-
}
|
|
6
|
-
export interface ExecutorResult {
|
|
7
|
-
output: string;
|
|
8
|
-
exitCode: number;
|
|
9
|
-
agent: AgentName;
|
|
10
|
-
}
|
|
11
|
-
export interface Executor {
|
|
12
|
-
readonly agent: AgentName;
|
|
13
|
-
run(context: string, options?: ExecutorRunOptions): Promise<ExecutorResult>;
|
|
14
|
-
}
|
package/dist/executor/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { ConfigPayload } from '../config.js';
|
|
2
|
-
export interface ConfigWriteRequest {
|
|
3
|
-
cwd?: string;
|
|
4
|
-
config: ConfigPayload;
|
|
5
|
-
}
|
|
6
|
-
export interface ConfigWriteResult {
|
|
7
|
-
configPath: string;
|
|
8
|
-
}
|
|
9
|
-
export interface ConfigWriteService {
|
|
10
|
-
execute(request: ConfigWriteRequest): Promise<ConfigWriteResult>;
|
|
11
|
-
}
|
|
12
|
-
export declare function createConfigWriteService(): ConfigWriteService;
|