From 4272c1604dd17955f37b4cc5db6672dffe75709c Mon Sep 17 00:00:00 2001 From: Dotta <34892728+cryppadotta@users.noreply.github.com> Date: Thu, 30 Apr 2026 19:57:05 -0500 Subject: [PATCH] Add ACPX local adapter runtime (#4893) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Thinking Path > - Paperclip orchestrates AI-agent companies through a control plane that can start, supervise, and recover agent runs. > - Local adapters are the bridge between Paperclip issues and concrete agent runtimes such as Claude, Codex, and other ACP-compatible tools. > - The roadmap calls out broader “bring your own agent” and claw-style agent support, and ACPX gives Paperclip one path to normalize multiple ACP agents behind a single adapter. > - The branch needed to become one reviewable PR against current `paperclipai/paperclip:master`, without carrying stale base conflicts or generated lockfile churn. > - This pull request adds an experimental built-in `acpx_local` adapter, integrates it through the server/CLI/UI adapter surfaces, and adds regression coverage for runtime execution, skill sync, stream parsing, diagnostics, and log redaction. > - The benefit is that Paperclip can run Claude/Codex/custom ACP agents through ACPX while keeping operator configuration, skills, logging, and transcript rendering inside the existing adapter model. ## What Changed - Added `@paperclipai/adapter-acpx-local` with server execution, config schema, ACPX session handling, CLI formatting, UI config helpers, and stdout parsing. - Registered `acpx_local` across CLI, server, shared constants, UI adapter metadata, adapter capabilities, and agent creation/editing surfaces. - Added ACPX runtime execution support with persistent sessions, local-agent JWT environment handling, skill snapshots, runtime skill materialization, and isolation/security regressions. - Added ACPX adapter diagnostics and marked the adapter experimental in the UI. - Added command/env secret redaction for resolved command metadata in adapter-utils, server event storage, and the Agent Detail invocation UI. - Added Storybook coverage for ACPX config, transcript rendering, and skill states, plus PR screenshots under `docs/pr-screenshots/pap-2944/`. - Rebased the branch onto current `public-gh/master`; `pnpm-lock.yaml` is intentionally not included and there are no migration/schema changes. ## Verification - `pnpm exec vitest run packages/adapters/acpx-local/src/server/execute.test.ts packages/adapters/acpx-local/src/server/test.test.ts packages/adapters/acpx-local/src/cli/format-event.test.ts packages/adapters/acpx-local/src/ui/parse-stdout.test.ts packages/adapter-utils/src/server-utils.test.ts server/src/__tests__/redaction.test.ts server/src/__tests__/acpx-local-execute.test.ts server/src/__tests__/acpx-local-skill-sync.test.ts server/src/__tests__/acpx-local-adapter-environment.test.ts server/src/__tests__/adapter-routes.test.ts server/src/__tests__/agent-skills-routes.test.ts ui/src/adapters/metadata.test.ts` — 12 files, 87 tests passed. - `pnpm --filter @paperclipai/adapter-acpx-local typecheck` — passed. - `pnpm --filter @paperclipai/server typecheck` — passed. - `pnpm --filter @paperclipai/ui typecheck` — passed. - Confirmed PR diff does not include `pnpm-lock.yaml`, database schema files, or migrations. Screenshots: ![ACPX Claude skills light](https://github.com/cryppadotta/paperclip-1/blob/PAP-2944-acpx-make-a-claude_local-adapter-that-uses-acpx-instead/docs/pr-screenshots/pap-2944/skills-claude-light.png?raw=true) ![ACPX Claude skills dark](https://github.com/cryppadotta/paperclip-1/blob/PAP-2944-acpx-make-a-claude_local-adapter-that-uses-acpx-instead/docs/pr-screenshots/pap-2944/skills-claude-dark.png?raw=true) ![ACPX custom skills light](https://github.com/cryppadotta/paperclip-1/blob/PAP-2944-acpx-make-a-claude_local-adapter-that-uses-acpx-instead/docs/pr-screenshots/pap-2944/skills-custom-light.png?raw=true) ## Risks - Medium risk: this introduces a new built-in adapter package and touches runtime execution, adapter registration, agent config, skills, and transcript rendering. - ACPX and ACP agent behavior can vary by installed tool versions; the adapter is marked experimental to set operator expectations. - `pnpm-lock.yaml` is excluded per repository PR policy, so dependency lock refresh must be handled by the repo’s automation or maintainers. - No database migration risk: no schema or migration files changed. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - OpenAI Codex coding agent based on GPT-5, with repository tool use, shell execution, git operations, and local verification. Exact hosted context window was not exposed in this environment. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip --- Dockerfile | 1 + cli/package.json | 1 + cli/src/adapters/registry.ts | 7 + .../pap-2944/skills-claude-dark.png | Bin 0 -> 75911 bytes .../pap-2944/skills-claude-light.png | Bin 0 -> 75879 bytes .../pap-2944/skills-codex-dark.png | Bin 0 -> 75470 bytes .../pap-2944/skills-codex-light.png | Bin 0 -> 75432 bytes .../pap-2944/skills-custom-dark.png | Bin 0 -> 89572 bytes .../pap-2944/skills-custom-light.png | Bin 0 -> 89232 bytes .../pap-2944/skills-empty-library-dark.png | Bin 0 -> 41597 bytes .../pap-2944/skills-empty-library-light.png | Bin 0 -> 41503 bytes .../pap-2944/skills-loading-dark.png | Bin 0 -> 37171 bytes .../pap-2944/skills-loading-light.png | Bin 0 -> 37151 bytes .../adapter-utils/src/command-redaction.ts | 21 + packages/adapter-utils/src/index.ts | 4 + .../adapter-utils/src/server-utils.test.ts | 81 ++ packages/adapter-utils/src/server-utils.ts | 203 ++- .../adapter-utils/src/session-compaction.ts | 6 + packages/adapters/acpx-local/package.json | 64 + .../acpx-local/src/cli/format-event.test.ts | 121 ++ .../acpx-local/src/cli/format-event.ts | 121 ++ packages/adapters/acpx-local/src/cli/index.ts | 1 + packages/adapters/acpx-local/src/index.ts | 47 + .../acpx-local/src/server/config-schema.ts | 102 ++ .../acpx-local/src/server/execute.test.ts | 362 +++++ .../adapters/acpx-local/src/server/execute.ts | 1212 +++++++++++++++++ .../adapters/acpx-local/src/server/index.ts | 5 + .../acpx-local/src/server/session-codec.ts | 50 + .../adapters/acpx-local/src/server/skills.ts | 106 ++ .../acpx-local/src/server/test.test.ts | 49 + .../adapters/acpx-local/src/server/test.ts | 295 ++++ .../acpx-local/src/ui/build-config.ts | 139 ++ packages/adapters/acpx-local/src/ui/index.ts | 2 + .../acpx-local/src/ui/parse-stdout.test.ts | 160 +++ .../acpx-local/src/ui/parse-stdout.ts | 158 +++ packages/adapters/acpx-local/tsconfig.json | 8 + packages/adapters/acpx-local/vitest.config.ts | 7 + packages/shared/src/constants.ts | 1 + packages/shared/src/environment-support.ts | 1 + scripts/capture-acpx-skills-screenshots.mjs | 43 + scripts/run-vitest-stable.mjs | 1 + server/package.json | 1 + .../acpx-local-adapter-environment.test.ts | 129 ++ .../src/__tests__/acpx-local-execute.test.ts | 603 ++++++++ .../__tests__/acpx-local-skill-sync.test.ts | 78 ++ server/src/__tests__/adapter-routes.test.ts | 30 + .../__tests__/adapter-session-codecs.test.ts | 45 + .../src/__tests__/agent-skills-routes.test.ts | 93 ++ server/src/__tests__/redaction.test.ts | 47 + server/src/adapters/builtin-adapter-types.ts | 1 + server/src/adapters/registry.ts | 26 + server/src/adapters/utils.ts | 3 +- server/src/redaction.ts | 51 +- server/src/routes/agents.ts | 22 + .../services/environment-execution-target.ts | 2 + server/src/services/heartbeat.ts | 8 +- ui/package.json | 1 + ui/src/adapters/acpx-local/index.ts | 11 + ui/src/adapters/adapter-display-registry.ts | 9 + ui/src/adapters/metadata.test.ts | 33 +- ui/src/adapters/metadata.ts | 11 + ui/src/adapters/registry.ts | 2 + ui/src/adapters/use-adapter-capabilities.ts | 1 + ui/src/components/AgentConfigForm.tsx | 17 +- ui/src/components/NewAgentDialog.tsx | 7 +- ui/src/components/OnboardingWizard.tsx | 7 +- ui/src/pages/AgentDetail.tsx | 21 +- ui/storybook/.storybook/preview.tsx | 17 +- ui/storybook/stories/acpx-local.stories.tsx | 896 ++++++++++++ vitest.config.ts | 1 + 70 files changed, 5521 insertions(+), 31 deletions(-) create mode 100644 docs/pr-screenshots/pap-2944/skills-claude-dark.png create mode 100644 docs/pr-screenshots/pap-2944/skills-claude-light.png create mode 100644 docs/pr-screenshots/pap-2944/skills-codex-dark.png create mode 100644 docs/pr-screenshots/pap-2944/skills-codex-light.png create mode 100644 docs/pr-screenshots/pap-2944/skills-custom-dark.png create mode 100644 docs/pr-screenshots/pap-2944/skills-custom-light.png create mode 100644 docs/pr-screenshots/pap-2944/skills-empty-library-dark.png create mode 100644 docs/pr-screenshots/pap-2944/skills-empty-library-light.png create mode 100644 docs/pr-screenshots/pap-2944/skills-loading-dark.png create mode 100644 docs/pr-screenshots/pap-2944/skills-loading-light.png create mode 100644 packages/adapter-utils/src/command-redaction.ts create mode 100644 packages/adapters/acpx-local/package.json create mode 100644 packages/adapters/acpx-local/src/cli/format-event.test.ts create mode 100644 packages/adapters/acpx-local/src/cli/format-event.ts create mode 100644 packages/adapters/acpx-local/src/cli/index.ts create mode 100644 packages/adapters/acpx-local/src/index.ts create mode 100644 packages/adapters/acpx-local/src/server/config-schema.ts create mode 100644 packages/adapters/acpx-local/src/server/execute.test.ts create mode 100644 packages/adapters/acpx-local/src/server/execute.ts create mode 100644 packages/adapters/acpx-local/src/server/index.ts create mode 100644 packages/adapters/acpx-local/src/server/session-codec.ts create mode 100644 packages/adapters/acpx-local/src/server/skills.ts create mode 100644 packages/adapters/acpx-local/src/server/test.test.ts create mode 100644 packages/adapters/acpx-local/src/server/test.ts create mode 100644 packages/adapters/acpx-local/src/ui/build-config.ts create mode 100644 packages/adapters/acpx-local/src/ui/index.ts create mode 100644 packages/adapters/acpx-local/src/ui/parse-stdout.test.ts create mode 100644 packages/adapters/acpx-local/src/ui/parse-stdout.ts create mode 100644 packages/adapters/acpx-local/tsconfig.json create mode 100644 packages/adapters/acpx-local/vitest.config.ts create mode 100644 scripts/capture-acpx-skills-screenshots.mjs create mode 100644 server/src/__tests__/acpx-local-adapter-environment.test.ts create mode 100644 server/src/__tests__/acpx-local-execute.test.ts create mode 100644 server/src/__tests__/acpx-local-skill-sync.test.ts create mode 100644 ui/src/adapters/acpx-local/index.ts create mode 100644 ui/storybook/stories/acpx-local.stories.tsx diff --git a/Dockerfile b/Dockerfile index 35f11219..6fa685d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,7 @@ COPY packages/shared/package.json packages/shared/ COPY packages/db/package.json packages/db/ COPY packages/adapter-utils/package.json packages/adapter-utils/ COPY packages/mcp-server/package.json packages/mcp-server/ +COPY packages/adapters/acpx-local/package.json packages/adapters/acpx-local/ COPY packages/adapters/claude-local/package.json packages/adapters/claude-local/ COPY packages/adapters/codex-local/package.json packages/adapters/codex-local/ COPY packages/adapters/cursor-local/package.json packages/adapters/cursor-local/ diff --git a/cli/package.json b/cli/package.json index a2d0b3bf..73ab7c24 100644 --- a/cli/package.json +++ b/cli/package.json @@ -37,6 +37,7 @@ }, "dependencies": { "@clack/prompts": "^0.10.0", + "@paperclipai/adapter-acpx-local": "workspace:*", "@paperclipai/adapter-claude-local": "workspace:*", "@paperclipai/adapter-codex-local": "workspace:*", "@paperclipai/adapter-cursor-local": "workspace:*", diff --git a/cli/src/adapters/registry.ts b/cli/src/adapters/registry.ts index e4443f55..59799cf4 100644 --- a/cli/src/adapters/registry.ts +++ b/cli/src/adapters/registry.ts @@ -1,4 +1,5 @@ import type { CLIAdapterModule } from "@paperclipai/adapter-utils"; +import { printAcpxStreamEvent } from "@paperclipai/adapter-acpx-local/cli"; import { printClaudeStreamEvent } from "@paperclipai/adapter-claude-local/cli"; import { printCodexStreamEvent } from "@paperclipai/adapter-codex-local/cli"; import { printCursorStreamEvent } from "@paperclipai/adapter-cursor-local/cli"; @@ -14,6 +15,11 @@ const claudeLocalCLIAdapter: CLIAdapterModule = { formatStdoutEvent: printClaudeStreamEvent, }; +const acpxLocalCLIAdapter: CLIAdapterModule = { + type: "acpx_local", + formatStdoutEvent: printAcpxStreamEvent, +}; + const codexLocalCLIAdapter: CLIAdapterModule = { type: "codex_local", formatStdoutEvent: printCodexStreamEvent, @@ -46,6 +52,7 @@ const openclawGatewayCLIAdapter: CLIAdapterModule = { const adaptersByType = new Map( [ + acpxLocalCLIAdapter, claudeLocalCLIAdapter, codexLocalCLIAdapter, openCodeLocalCLIAdapter, diff --git a/docs/pr-screenshots/pap-2944/skills-claude-dark.png b/docs/pr-screenshots/pap-2944/skills-claude-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..35720124f43307b1c4fcd8bd001c5a458c700354 GIT binary patch literal 75911 zcmdqJX&{vE`#y})qNF}ZNLnSkY*Cg-%D#=UPb&LX){MQrTQ>|D z7?|PPz1jzu;LC02+&v5oM;UJ4xNiLD!`z5>HHYo)?o!&%4%V()zL!Q$TRrv?#vTw# zeVQ)Vb>?x%(*uvaF6DdO^7TFR*h{W4}J1@6TS2Bl&77&J)y$RXARwM z?<05j)~y%xH)E))wYqVL{!Pef6^4EEZ}u`XNzlKZ7CailNdM+~D8pg;*8?nj@6f-h z=$~eQOJiVo%*1$t{`DxwfjauvkktP*eCRp z<-b-ybEbc;-8T=;oH=tmq%iv{??v5{I`QN7rq_S`4)#2I+Vax_E^+JX;N2Sf8g0!V zs8i{G#VH&cPUI4^e6%u2l$n$hja|mZ!DGm6LwQ{u0o~6p;OheTB$%(_344tzi7+pk@?`#*Ph#hDw}`W zP*Ofhv47kI>cbA%>uuVjTUO|AyO;-`O5*6ay_r$wt%u`vjGJRoN*h@JwLf;|xgG;W zwyjBWq>^{j;he%a@fFb*Fov&yUu-iw4Kd`&DHsn63^$R8XqjqzDC?VabFAodR^IH{rWj%O;ZFu<`bbaO5@nn_Qm?y7arSTq z`u-U|Gsd_kvB-btci~OsJ2~Mu?X3yF9t>G4n*KQSA6VU<;Q9LqDEU$&?B=3GLg!d1z zk779dG!$MX^xaIamBWQf+GXzTOjqZ<>f^GtzI2E~up{#}`?OB&_G;3O5_$y-d$BFu z>(hgucN@ZOv*+6x@N?IKcLLPM4zdeyh?p+smyiBkPK8&=I6nybgNzv!uUS89Q~%Uy z5msh{N{Ksv`ybJ=dyPkgCCGBrWcr!A=D+vO>BCrQT(~oqdmRo?_}kU}&+auw&gbzu zU)bJUL-J9#*T&l4Uu=&Rwb;rd$Dx8Mf_H;p`P)CpPkcZXSXMmQ&n6U{eATy29_8Ad zs7T7dxlgxY2-ZY6nqAFt;ubZc*46#X|IBpf=;8N{q^rMzB@_1Mm-oo@Tb>d|7L+h$ z2YCh^MIkwQ6JWt9a?FcfTH(Mj~iw!%5ft{`!sul6I->LD&OZqy7sC z9aVQ5SaifK%0w2c_Ivz-H)S}${_iTJ^NzdIu%?4$u0!z2-A5|DN2~n~afwMUv!B1! zk!zF_rMzR>opCdwYp_L5RhgT491iEu*s4oKL1N7oO2)abWLo*rqKcVC*U8SAs&_iNXRdt&tU#jfAMv)fGYf`!i) zI#l{UdCeL=-g{8wTIBlD1b$59-(Nj;=8gLw#-ljcXE>&oi{^W{giZ3GUX0WP4#BT7 z>>M|SzwJpS_d3Adi{R;1b?*G!+N&HT zL~mosGH{B%MTef#h&(ChHat}Bu8dy!{#fnni(~8p+K-?RC~ZJN4XNcXW9y2BquE@44+kIvhSo|QVCYdhPU$KlT{mY-wT)Bfgm;MBsG=WI_FCq4^3fh!+X zI#eh36uQYc|Be52&#)Kt*F)C~`G2x&9zA22dFyycuz8;8$F6K0-ZQFCp^TZfzkhm= z9cLrwK3WZZZ#o~%XwVG%gh$Ns6Eqf!;6sWgAFe!HNkw}R@;B@+=p|pXu6`6Jj#{n0 zWM1L`1wp@=|JtL)#h+>fUp9WFfce2v=!0c&(2Bj?csJSHHkFI2;N#cpKRQ$=C1KYR z4`)D-nNPt>&~5lr&2g{Rh!sqj6*biD#sWVAv*};4*-yq}J&^tIA6uP_e?H(*=$-!I zrBHn(X-3^pDAp=Xldt(f1ET)8n38$xZGCdCV;0Kxj{0eP6@)=&vhMG9(vDq4w#`1X zUA9ZV8lVBn$pvoCmqQ2W%!fn!XOvhqbk43lc^e8DDc^jE3l;Dae_)`{MomVWVqDSQ zVxU!Y|3??pb>>6Iu}Y4g&%h-HZme*_E{ApmjnCZN(8_l3;K2Y_=3IAj;U6IULj;-am2QRQwUXVjj>&+cbC<kL*D_gHqE4H;#dn9mpkR zr;U*_P_}5lIoTA0LeE~%nK@4fu}8J(_zZ896S*^5=}m!(kZ{@7(98HP)Ywd7$XQCE z%@^$rV$gOa(@UvH96HY;<}rL0qv}UXlg)8gkvp9l{FfM#94GOo6w&c3y)}XU%y)F) z{@;gM$I2t!;kCQ74dpffiiVDy>)=WZ(z^32pf<#wl|c_g45CH4+dR*y7Y7Bha40X6 zl%}?S*%ZeQyQ%lFb8x~-XmPu+Yge~E-fJYIFb}aN`H35%b!@Fp9~WwON1>qANda=M zH%*jw{5#ofU-5XRB|(Z)lamkeT}ItpO~$(Tb@ke)zgt7Uyyuj|1!w@>UT}~PNA`U}%ALF!>M$%_8CLNjQZZ{ECt{$<73j{Fi`$yrux+k9N!XQen3SB%|3wIKu6o|%HNbZ)ojhOe&BJd{LfFA91 zzrE&$8kJ3*86PNjPccc4=#u9lMBxiy8!cz@AwQfO>Azvh!jNfMN^_$8!3O zm%omO#GGpV`k47p5N(pHJx1^f0;_+0)huCQ*p-aMA76no4{#I%|SOag=q>q1O z)AwvS`ay#VE!gNo?z!zLW>xw7c*q!Dok6s5>c7#{t-I`I-|?-oP%?Eg?6w6)Z@vrzEIaHco1d*#Kk zb0wQzqn}sWVF~vftV3Ih=6dd3{eY&DFRfDcHl<#FGJL#m2Vq>c+k5JxWsa;igB#pN z=)&{ur;?P0t9;#`>|>2QDgUbsC+j*GK%0!4x<@AehU;xfl);-7+d;Fd^L#D-nW^3s zAn*$Et@qFRFd>YnRi*K+UE2pU85Mu-P5-1o1hcmW^Bu%PPNeE~DetC5_U_iQp8wQv zg(v4N5#-mwN^iXC+icF57~Q~pjZzJx7LJhy%4J+$tdHYZ4UxnQS8Ut0039THEILn{ z)kG3#*yp~9TOY10!GWJ&@n0Ojo~3i)e!FGdS@m$h?!wzb&AD1JDV#&n%0}7RMmf5H zc?+p%OHI<$$LLUm$oAqFHpE@l#Tv~hg>IWJg07(#a0he%ne}~8sWSlkv{P3B!~(L3 z)>W)^HV?!KRR-S3C9Et!?G{1G{uwGKz;ER`WVc<7NB!VbITtYuW& z)XV_`Suta*K3rqX_Ns-{?sB`b9E$Mok^J?K!)cKLl5%^3RHL?tX`xDj6m&ezbK(2~ z3H{2k6MnXi*z`)%0)A5={nQY{^a?v~D232vJj7^lnHYJ`Z#%iXh?wnQ&F+Hp!l$h& zJQ~nvr&uf$OSWk?iddltO?}NLuxUri-BBU-I%bgZ(wZD?K(AB>WoL=`)Y%Cq0z+4 z!?NOL{y=Pfx%*fd;aA_!%*x6(0SEJo93QxtvCs1ATz)NKuKGs%$2_H` znm^Ii`=As!2)*Nx7@c}&bk@=i=RauRoueVkyWe0ZzewKOv~OW0XH_{Z(zVwN+9>*PItcYHA`K)vy(3OAi4c?2Tg`$Q~j zM3u%LOo?)y?aEqh%)~?!wPJ*_m`ZVk@W%r4N%;;v*teP#A*_P9Ei!9xXURUxt6YjJ zwEN{g?@wqIwvUe8*#HcLB7_Z;KfjED1xvK8bBjN}0BJ9?%uzLtHu+fzXgiiNxbUmt zmAHAyck3=)pn{q1ip=U1R1i&ln#XG}{pG7kTxAr$au9TgP=dxL9wepkweXrWvAMEC zBBV= zvppKTyAA3_zZ|{Nty1f%d>3G&6)&44rN_|%a__nVcjYLaXn2)lxiOXG9(hV}kn#k_ zl($ic`o|+b$+OPBxuaElN6x-zCyNN)_-;GBKEC$LDb;BqIg^@uca}& zY}J+Eovk*8xlGRsgJx5M>lYt@*n_n8Q|GoAC{+n%x@44HV%dnO4cg||Y!%lHYYKQ0 zCm-_wD2Q!ytYhimLw6!Ib|A@Z*eBF8k~l%X?P_q_U2eQO-YQmrYoVA#<(m~}@8HTz z0M`I;+S*!fXXTacIjL^c`#es>>{prWh*M4Zz}B00%h?Mxn}2{x#G+Ut0Afpa1Jp3S zW3m^R40dPxZ?kx*ZUZmD*Z2#NaOVmo6>h| zY;!bN+#+Ru{IFY)+%00-;|eREX61QjV=OwMhd!HR#k_`Xjm4q4dsYCiajK@=uoeDfIe{m;b~F8vOdgrtGz;j%`dA zvzkeFWWJMSf|2g@0-95j#8gqE04z#i8&_hHXDYeL-mLIsd^k#W8kxuo5KWR@Z}l_$GiYFiMVYdsm(bKpc+--q5e}N3}t&5;S4OG z#BD@@Qvx_~JgAchj@EYOOIrP?Y|bk&(K^(1axcCO#bD^@+nOkYGZxMV7~lZfS@N2q z&s=;_LdBbPAQAFVMv5xC^8SKO8TRV9sMB#H-PNt{A05=R<&C588p!X+pXC4~n$p`E zK>M)^dSEK&7^?p2_$7IN6CPMC)9ObLn-R7V+)`737T*cznAZjcPPfZ&hkr^5`1=y= zv9U5sL{kl=O0)r|wjd3o;FT}MC64q$cW?EcfD$_b^b)$;+Wb&Xx-&rMUKdX%HLJ8_ z-_hn0jr}2KD`hR8f2Oy`E<8;>t8VsWXj`@54Ea-K0IjHL5L#6qjcb{E0uH?Yw(1n1 ztORBN7bDOVm3P+F6z$w_MmcRfT&@N{Gy?-uk;lv>Et2xSs5MKw^mhbsQ+2sOg&Fr# z2l}G|3pDRuSrp9hZNuJ$TTd+Q11hmq)%khWnkpi4G#h zj!XfVJ+J%W3a|<(yA}y4U#Kd6%Xao*o--Y3;jZR>AfqH!nHJzak;|u&QX-%hVH=Ho z$}IUEW#g=y0a{J2rro{ZgLr09;_w!#WSHl)&Q+he1B>k6^|X7D^NrAZbBD>aq%T50 z$X-vT+fQ>39-sI1j%1n!q%u!KjPA@zKlSkiam35g@r#Zl>4T!dg<4c?ko7{=I31fc zdn-Pk!Rqf9BI3)vw*Y~#B34xj@xu^A}Lw@5z9aD`L8t|zv1HSLo(#e}an8RXBI z?>%m%wRM)8$f&G)=jy}{!qjR#=c!R{BhzA(;Ug0##P%{MrQs*tYB!eI!l4lI!~%~7 zVd6^gnv5}MDJHjBw<6bb z0d(laCSihUaGY_jp)G*UHy6&`d~FJ+NYEhtQ!7aFo={svHJSrOxqnytcmvx8-Ri!g zR`BvM&Z(8loTBE^lz|s~SIev=KX}$J&h(;HRaNtXdy4%rNUj*55FWq3_f7Z%|CGA_ z{SNW_->FvoMFQtdJsW>l-PJ@)u z>iWA2TCq?@V0`0X?ktSJ^#D@a*`SD1#?*(_L82j8Rmr{y!vy})fQk$(*njDlI%Uc6 z=?LsHki}3{KBAy;0&Y&Z@-RI`F&==w5CZ2i{0WGoUPs$Wc@Me{)1IuDCYJlw4c^*k zuKyuyg6V)TJp7h()m-eR`QNegd6nk-Z^AN>^2{ctBY}|+y(xXL-|{Xxjdq_jusPdf zPZwiG0g(c$CsSLKxs?LeVOlcv+HqSgd6rVGo98eIsBs6n=pM6CKW(9f+!RdJ)dxVjj50~q-F=R(PIY-^ z#XCE3iJ(hBHChLH8G0>j4=Twsn`k#JNt3qPKW;{sTI~J|R~$MnQfS#(08~EwD=Ls0 zLtS5SGf!1vlsb$^?~|x!LANO_sf`qT-?-0cI*U9vP9JMrGTG^=WfG~<5>zR5}7sPhr3_L)etiQ)R9{l^(;)Ndj1UDjxks#B|+Yq}Jt}axw!(agj zSVI0IYAV(p1B`GH(}qPV4q^m7SLQuNH9A>sgIqmZp&JjR+oUvv{p> zx{3S@pu;Utbd9476DFa}1DNd1wZ(+)fLv?*5T~E^*rW>PF(V__Dm5h)crk(oXL~n{ z!}>yckyn9_=99zsW#fY4opNp#@Wi`~)r^Rw9>d*S=5a>5;>>QcwqdT8Yi9HG=q6vI z!F@^O{^y_cpSrLtVyK$x!3L4MCOx`(cfxQe08x3_zRfbk%Eqf+9}&-uXv@(ldI=BriUa zJEEY4WzWFNHVYZl6WtN3a|TpgnKSGRYf?tb?l)d{IH^|MPB_`mUSXb$5wA-LoX8Ra z)ihiT1kCQ2$#CZ!q+~`B`Ugu1B}T@tOyqApFOb!w7~si$`S@02*9U-DvhO&oy*#o< zJp-tPX+iT1;QP)OX*@DcSXQ!Ru`ac`FSnrYNrCCdddiuluU7es*&3vS$BKVAsexWr zQmtU3$BI!fXo022@DMIMKg^weu6uN|65-lC>RZs^yexu@fj*0aX-2no$CA6FeomKm`%qbvk*w1=(cV3?oVVFBr?ZEOTjtO7jKAiVf(?XJw^Hmb zC5e!V1%T1gkzwGtqh14Oz`ZW)A+Aozn)jii_ef^f6VT^CD-(*F_15-w7hQxc^~k5n zX9fghIxVf zjtZPUO8OcqwIzT+V6f&|Rp<`Flv{cu=MNEUW(5>&O1txSl^zZs@hI2rC^#u`CuD#N zT~8kswZuzKg@F_{NhV+d12BlT=koTaUe2&La&i zaB9fCws&TkKJIyBJRy&{i~Ogfs%8@RQ`)KL);*3^xd!eAPJ(EU#7Zg2+GtdN_GX3; zG0r*r86S^I60`K>zDMo6b?77C;=7rZ4 zb~um~fzB(CC{bl*b1kAV6rxREwzW@PalD1Ak9%gxGwfiTZ!1Ewji3|n!R#|N`_{~h z`xXXt^UZ7}fq}a9o}fVCF=0#MGp_P+#RTdnb_w`zuOyN%4zK>X5N??8%+js}H=%J( z0+mE4n?2f9z%6Dh>zF3Ce!9V4F3sq@D1T@SOYGA_P2 zbt}V9lwgp(@9osn$Z%{d#lwsGasw5Zo}t^|cfrXMHFBTOGdY zH1KveEvF0SX&V}Hvp1g6JQ!VbmyJpXpG+BjCGQs{@F@c1yr2-K=$`;*sk%nROv#$D zT5Qglb(K=>5tsZOZQDIHb0g=t#QtQ`li>kbbrU|_sgto-?#frzUEb$sUdS{)Aw?GX zDGE?IOpt;jxzoI|E?5-@W*=?zAN2fPVu9117%RGIqz8AeJ&4qyl~rG1h_?=lw(B)+ zU0OC(n4(_JI-G~eitJj&jd@)*el>fvw}L@2y_nHW&xVMbx%T!C-i>sqbo z(-_nDNkaE8wPa=_plI*GdXgVZ>C5N2Al&c#At&||_2o?=RKQZ$lxe}&g72BnyX&mF z%}sf2$p=Gy!_uBPejtJQC4xhygLGijm=6)KSSjDO=@cO4HKT77*P)_u;WBGj?-wC6 z>=irQFCMbvi|oob7FTu3v3qSQ)gyXNx>o7>V0j3?a;BWGV4n!pVH_OxJ6d?Xw>MwZ zY>X;17ws&G6fXanDgqi?gU|9YB^m9{KWc8vcW~q~%?hi%LK&QolQ@g_86lHg}v=*nuQQb;l=VkVLo6E8uSMn@)TCA2)Fgmexd zl%ui`3A9*z6OJUfyo1f}-iUeM>P$eQ2Rh&89mJ%QJ2ReJ;}I-Jyft{~^l+^@xB1x!!CLfuD2YA|KBosK4Z*}gSE=D1jC1>2mJbmfu&BHt=<_C%|A`2|r zmfqVN#k`fa366-^cXG<>lfv~UR-iQna3ZvEw_`;TJOy(3(d0gr^G8awN= z59j_#YC6D!P54~WbOm?o(YAmo%F2e8y3_L=k(3&bi-B7tt&=DXjee;#xANZvf`0a0nNj%>QsS8=#N`GcL3|QSZhDj;$$n|M320D_H9Ms z$e!J=7^YfH_CXD@Prk|ZHdn^UqpnpqTL!7%Gb<*rm0RBaru}pf`7E$BZNrk+`CCma zMM4(eOZ>of(#ib#;9srh5g1YL7wCKqMIB_-M>(_5&y=_XXZDiU+lPApi>*p8@3%>_ca^B6ZVewV&=r?K?4*7uyx5d(**!+>?7x zX)Nu_5JjwPHq&rnlqib4t<&1~C4qhavx;~#oxf<<4>Jk2ZH;C@jz3%migK$;=)xKz zzpK4o;X9`4o8P?K|Lns6BGV(QD?M>ns5#5*ZD_Bm=W2@Iso_?+h8JR_z0ayOzPwyP z<>0fu5@m{!l%$Eixo601NaWxUx3=U<_rDZP7d~Psjs?pCXjX&GR%X7{L!XNAGOkAs zD@RQRG<4Uu1s$SplY*wZq;!X{8TA$7TXO=4O=@-qyC7pwT3ia!kztnuW`}mh%$IYr zfWJ&r_KUW7JIJE==K^>X2J&o568dI6jm~y#7GMOWcM2`l_7kg|J7Q&=O)%|!e!iYU zR_b?Rj;sU`n4*gx%?uc`I-jci)GB8%?Dk}o+B$tuX3Q@pgXB4#nEN>7+gqN=5~p6x zd)c3#?60!o&HelwZK@_2@n%@b{=_ZhdXCM~ajsq)@NcADn{)Pbv0KTO;#!rkiptV8 z89(Sf?pDDvXx=}d%U-}VD~7t-=`qhYVpU;)I3~JaC^d zfGplqL73b$OI<#qnZtPGS8GGRLjRn+g0V5Shh3lQxx0qwZT6tzRKtq(yfQB_&C&{T zir?i-$1sIoa7s&F*lFjP(I@eguyY!Fh3or`E;~70Y|m)+!|!sj62$du=zaDiS?j~} z+k5=7X{UbU`f#7ovwa6eCKbxrJ}bFtaO(wV3%O8ENL@E3ItAlnt#9(kx_t6qbK|>~ zID3ti96%o6JvF|>KTgT_++HoA{ZgCG5Au1hD=2T|K!gsWq~V*~C0qeC#h-ZPG1c z=A)kZpC&iLd0cB0o63iBC2}t(PH&XT_DX+1?YSq$<26yi-n!*pyKUkdOvx`V@g4s5 zxyIpn+e3pu0vxb5mGmG%m_&jE(GqG5j2#40zk)M8H7su`#Q=S;)+&5!NjMTQi^+-Y z$qL=_(lPb+K0TLV%nCY4krh#zzjKY}_polb-{0Ojm38!Shob~s54hW;BS}i7K&O_7oJO>2nh>xu1<#uFBv%;nkCX_u)*bwr)&gD$aBpN*Dm6ktSA+A%?@1v}pYgfr( zSTMS-7Cba5+~e1|7!Yd6IzSN)nVjftA!&U`JJ;wZJ-9zOq=j3X`A$0}CD1!MM?zkp zcbBZ!P9(7NgBl@$;!e%+1eIn!sptHrO4qZbox_Xkq*u@WxYc%FawU&1Z8-@i^|>GK zlO*Ki9I-2B4w%n|whmT^KpeyVAap0iBAJI8T(MFo;mwrv3R^D8k8fxRv~T$_;tuNLOy{oiqsT{bw2I;=B(y>{nLn_+eLGoo9?vkV|KrV>C-TOiwPb8# ziH;TNua3wzh{~wRsI|NAS>-UX;yb{XW&W}v+`=C<&7_TtcVFww@Q*}eT9+H3ApNA6 zrK(wdSptz821BOpmQ~x z4viUQZh7voQkkPTvpRc1x$5>IN|=>K_7QKCJ3%+dI*W132n!_nD`rYB?IP-vE=PTPg}$O#LLjH?!+_e? z=U+{J&(lDkN!Q#ycd?;XKiCVIt(}k_BY4&EMegrw9=~rjdoT5Oq^Tu=3;;Hz2wtxu z%hGer-p_*I?y>yfx#Wb+FCIs8lyl<3(=|wC&M#6QK4ZBtRWA=aG6ehat?mzJMogKn zbp}?F*hhm&qQh;JRhmjxXw{H=*LP6(I5$E3EO>5G?9DRqoIhx>SRSSt$JbZ7^g%8gs8C+)or|X`mv9*?J`(fd1TBGWp9okB*=!d~xbT~8VKwKkEPx`dyDzUa=5LoaqyE?a+kU<1ww?+#qX zO53ClHI%^TTC67y`>^}3a1X$$;MxaMnH(YZI_@PrF0_rWsTU&*lBd|~(VtYrCVD~; z)6FBJn~($epx{jgBdcksfsxEyacy;D_LVf9#jP7zO*evSK6Eb*2HB^qn^#P3V3U@Y ztr&g6h~~W~yo<(`i{A#F>U6UPfUPLrgqWU*Ot#-18O%lAqoxh%k`$<)+^&9)AYs<; z8^?C;+qk5^w?83m6)`@)G+c18f3%QHzW7LFK5)6zHFT_ji_m&Rf4u$i#h}T~+j|uW zDeL5iyV}hCdIcu@PHTR|^P{9PymFwGD!-F2?LSNVQ=h+{@_Bb<%PV^5Zu?4nPgO`+ zo1X?o-mq=B)H#kI_kw}Hx!p}>g@y25oIhak^GKDin$`NpQKhW|UtodsqF5vr<@|=_ zI&-#y@)-F4)V$gz2(f`?EoN4fIZb-Lk(Q0lMl~ZGmns9Wv!uVB^p&9fJyrg2=pMD& zgn}RahfHElpgdKac8;I)_AB>66A69Xh3Tf=m2we=x)_cpvYxW#%Y2lIqD|S2W zoHQ6}jHV88B~OXyg@E%n^L60*;?Fwq?@Wv0UoLcjNdf|Gb^rb5|32CFQ zinS(gK=+`VJ7K8H@F?IIxEb#=K63i`;z&>1oCGw|1jJ$(v(uN)YE0MhH`f!UpnNeui+v={(x7=HZ$zsfO1^a>a{ z!4rH{?b%`T{_{>FI9u!BZ7M)CkO)ygL_4(=O(3!1<7tufKIINsX|G$Z#5Aqj*Wd?20jfw)gANpIOKm>!!lsN|B1aPt-@=PCs77vrq zS5wmNqm~c7et&-pwhog>gmIsCtKR}~E!qw;Mi$H?&scfwe!QE6Y0Vgzn!p4He<_pd z{1IHz;59U@Fn@K)xEzGgYnmV(gOVNy10opH=q^K`!Lh5<@#W=ZU^6geg;3+egVIO$ z!PFP5?H`Ywy9xGRja>*>rNAOAR{n-hr_Cs9+Y}85X@0n(`0hMl3F8sO>>~h-^ymQG zGmw=_U&k7+MDWOvAq>K43lWJ_O#(}EWiE(Zps>SWJZ4ge&)Kzd0^W$a0Jd+4A=sYM zJxBxX7rELO$eGz&2=L1ku1H1yER4rgvPM9@1<=sHAdfVj_qZ|9iSZYe#zCS~uW3$YjsWl8;&Jin@M=ShN= zkm__xf|2?iM99H9xX1%`^e|3pWx+dFh$OU3wz8Dpes_K;I1ZGwTzvpVtYC%V0W?c|kITl#Bb`eSU)L6#FvwB7awk`4Eo&!kqDp1rLWtarTc!g%0Z z6S1khMu}mLBF6Fs=F^@@glWhw$|=Ulp=Mon@sA6Ie#D{x?wUyYeSdR?UVe^#{j`_o zfR@llC6f&q-zDwZUozX~1q)RkI~3(@nBXC2kulS-v*{jXl?M}Ag(1OGF>x@xzXF*J zutNO1M;}c5;{g8;n-v6I`Zxby$^zG`fU%J7u&|$nT6jDpM-7y_Z?H%ZL<_M$2YU>D zcJn{+t^YrSpXoQ~|B&MTPfJmNjB%ysbR?%XAXFka8C*uI2UzG)EXQ6P5HY;lNF@S_ z4~Xz|00g6Clm3^`Cm}rvRU~+G)z#k)pmvh9V|p!k8+zim*Vvj3^>%+4X?QLUgDuY zgo>Pmm>MXfrS4-&E=YWb1-vuFcAP390)l=4X%{may2l(^#Ly_wpNe!`g%KQ`RaIPq z%quz%TubOtVK}xhkQRpN^z>aYbiQ$}KAZ~@ zMXWHgO*>B1!UtSVeZ`ppS0HTwg$QQc!z@>$N(bT0fr-HSkcEvXG&ph{)Su)l5AQ;c z;I;&sVhAlBR)SVRk6&Aqxp14Oj>V zU}4hCfeZea%;=rnwE(9REYnmV8L^j)Zu(t;($Etb2-8ZSymZ$JJrFLg#3Zr!!SJD> z8g;w-zgj>r@UICNjUN}c9`@rb3I768gOP*<4CTPf{&%{47XU&aJ%BX zvX1b|=7E#Ku12856e2cYB3A}10gw=^$)lF;!_ddCKiTJa_TIPG=GjoIljr@Qj6stx z0W1N=5qguKHz~D&!ULZ<0TO1g9*F6cVsiw#Hw3_j7#KueiPz{qX${D~{wnMC`)@4H zVB+c_x@&-VXK!|d*hjG5^eGLJ64RG_W%-g2~P6clR1|pr3j5EdW9}QU6 zDQ9j$x5PRPLA7+8!mBDlwsyV|e2CEVEAD)L?B<&Xi7>PyXguIGL4f0ko;$q;=X>$m zWs)-etpE~%>(Ve;#G))O5MKnDLs!_J0pM4McI^!=xo&8=66HbgDfxre)9RC0k}qgR zpMV@1B>$w9!3kupO_?PTQ1p-p)*DYdNjNnFTO;w&`eK?>8$Fod-0n;uW((pKa7_1M zgs&07Gg&PIZfF1~-HDtPrFP6CfJ~kr;%cKfQC~RKl0SlJr%H3UDI9{7(v;h<`^_Du ze@b{kM}^Q2WUuc`!D-aIZEe%*`U5g*GkKwjqznx<8B=1W00cOPcQ;B4S6|5b0N#Y< zL*m@Kvm-o1VObOI*1)p@sC3f?-DuTz*Fgi|;})2soQ5F5m-)PSAuEZaM`o!@OI!w0 zZdD64Mr-DXH+^TXZ71wPPSV%nPRKfq=uN%w6zPVP}A*^t%^sL5FjJ z8d>_SC;&l!()$z6X&f2B{YuNdNDng#ndHIR*f5LcoAv723dKAI<0UMI3*yGuqY2jb zRj>I$L@)rLtOr=9oOkittcG0xawlCIv=Eo6gkK*|(K8L!NW36+gB}^A-$4Lmu8?Ab z&;`rZ+QL|QGPk!Xpk(70$si0sU!$fjPq&k%s?@hLZ@;ID@i;d8^Qe>Z|EzD664_2& z(`TF6dmVfnhz+03blu)>y?elu*;Vlx>Rpm*NmDH#oL(LB*=;;KH;9{M8#=c4J;h~A zHz5ayVfpQ}h$qzG_8Yp6(NlcvXF&fr_a4a^LPf?Havp9)binR_gnE)40Bqw~BzvVJ z9N%nRL4i12b#CGPDM1UNeM7dr(89rurFu!r+n`|C^qG>!Y7 zcizqok#5A??_q^>A>)I0XgNFN>+mFixe8g%=Tte!A4K8PODasw9hKj-4+!n22f@>9;aP&{F4gS1a!BR~QHT`(ktU!umm5Cla7d4p1ejA0HBc|-%XMtRUaMR+j!F`z} z!%55Kp9pn*N-Y@43o~b-3Jo?V)j4AA94dm;ZhfGXD4WtN*b7MMd!E>OGKghxzYFS+lUZS2=@7oR}5QT>1 zBo66nncFY&1{{J?$G*37RM5cu_v{Ftd9Qlb93%;`c7Nt12|den@f0cn_!P&z8SOa- zS7^oSA;17t7UBBaF~Er8@1`z$*2Yq*QaMBDh-?;i)W9;>JMZd2biXzwc&8%#dD|xL z>H61!Spbw9l&xRFwzvGvy^WhW#pn55FN0ZXz5)l*rcUxTvrZ)K0UUCnmNp=p$gSnf ze877q*jKqsbFvy{NJpcWD{$}?P^pPD2qtFhrMNZCmPy|G2BNFWcwOjVEG)Ar;}FD| z!6t}U0l#0ZW-Fjc@Ll;qyme~~55N?R7=2*8gOafc$w{*H;KMd%Xx=_46XfM~a3u%lQICFr@j8&0-CezH)D2$`{G60or;G&*z z=X)IC4dLFooEAo|%=hHJ*Ja!SJrWpEcg4Z^8?Lz)8=Rc}-acy7X|NjwK%R+w64RqE zX?gMT<@?`Lk5`Hk1ZE}lFGIr49J-!F#rdUjTa z+&3(;G&!58YDJp$;6^k)n-9Tdnkc{L2qF9nsI+in9|F=bZihbf8=y6viRtqr&9r3f z!w@5#J4~WUxM*M!9ZfM~(JRIQKBKr3G)T*1uMNST2b7a8gWwXx9P1T+~x)T1}Aas=S$rx;@Fk+KV z?x275;=$Hc49l>XSr3YdDMNCkQ1~jLTFDvRhO5Ju$ou`h&yGf@2Ebq|T53Nl&wcT1 z&AfMHSjAIo(_ve?XWv$wC6V%%CK{1E)!?qg;=xAo6QHc3b7p(uU<$~*a6lDmS!bFRrRW=x36f(tJ3i7hM>q4P)(c|)5RI~R=~+ha^GNBl!m<5iS?^{3MV%Z zLv(}=DSAXBtTu;`@vYfgVU3L&v(TXznV|33oPEr42#5^b?Mi>BO>i7QtDAstK+}N> zA=N@H1z?ZBDp!IH-rAD>03kFL$2>l(56=gv8?$7D$7Xzf#v*Z4VEy=i$lm|{=RCnZ z`#({g|5qMZ1%CPJD@FG0KuXrY{tnN-0TKg@-H&+4rne?O=Ekkhl!QP=md3jGrm;=>9Hi47?M>7UY-1eW#K^B8> zs-3{?cbPDk1oYbN1&-vgz%?u7L;hK9yK}|u>7e+4>IPnQ7>$m}chkX&XOvcI=yWrn zdT@N_-YSEq&q!T_bSiH0P1tlDCnTk zrC*}-H;@T9DvjXSmL3zyt}1aE_?r=>Gzd)rco(G?Z?9|#iYPtS3Ae&2;hzhd@d=Q+ zoP@Cvyjev6?Jr2#vQU|&pu5bw1i)iFyc$7fYR=y#pUigxHK{U#r0ND=f$bF}`T?dc zt%vccS&gGsum4~P7=-V)#CNv81KQxyi;LNIhgh?KUUD^9vw*DN<30@amN**Cr}~ci zHIk-CSOYayh~vIk-Gt(&56eCUb}w4+tx+GrApyl`tkG*yE5PU~=OaP7OKU-)c9R!{v@22Qgq z@e0JvmP4b3fOr5^&ILxGhfzRu(jQfjNLZ19$9O;^7UFduC{jOG4m8frFTW53RJ=*P z;iwT$3Pjr=;kUUmn_Ca;7-+?AXZ`XzJP^+`e z-VcisHy};n+y>9r;53u6ZOY7clA6~}QV!k$bO0~x9N5`=@E>~X8oaMK4EL5pDTanQ zB)I6D0r_>@5$T9E&wLNy?WI{lh4j4!7Y_D?*GJDhCWIMfX=Vl9-^B+RZ6M^}DK2=0 z&ZCeYDYhECKN(DoNt||Gh7QOIO)<&m_KK?Qo1R-R`bsd1MX;#TOxL;%b7>FZ~U?Z18xma%spvm`g5V zriFDL>dpuh9FzP-LQ+Y5-@Wj5oSpL!XBx2cf(VZ?6mOOVA|Fw0jJj0B%`(3FUoBt< zj_GPX?*F3ht)r^!+ILY546q3m+t+}FU{DGIDguHuYtf-7EufS%7AhzfAq~>31uPnA zOqA{}gDw#kN}ua__xIc5>_7I2G4?)VobR9SRZ$ktGv~bT`>J_pWE=wZP9z6#+yUlo zSmZ+CRo!YJr@K{Ce-dlx+&FEDSu`NZ8|b=)AH`HdPH$P}*>3G{XKc2LfJg3D#cqJf z;rSJAC@*Cx)k%oY{x)2SxssqToGb`5RtHD>GTIN)Bd;s!RVx zQFgLEO`O^r!1nCrnIyf%qS~~89vD^ooz)69Aqx9qgY>5kEalMC)D7`Wgd!Z3I&pu} zaAG|f{urSitHb54KG!3pm831ZT9#TAI=*S_>`(~eO)s)7D3~?7g<3$aJO)N`I9R^0 zx-Z-+Ede8JqDxXV=m+pT8prHi{lQo!dV;;(2do=4h<4AyqwkBY@nz<}NG#x$(z%Ns z^$95p^bx?a7Lcu3tc{yjbhmUH2pI$$dKpg9^IHr)*YxWycdSCUtSMIr11+jeeK2#u zDWJc15|DKjAxqUIRRILhcId_S`ee7F=_p4k0hQ2~Eiu5rZa$k&}$%3w)GW zN_{>?tk9~EeY!)HVK7B!c@Mf7{+fG6c1QpmJ^r!$wEOhj>g7!;}7R2N^EMQ?q)=nf5LDjB*IfnvY$ZkdqZt5*kFpv`UXqVx?iVm;JrQYVcKvu z!QYk8M~kKnFlquvDxx8bZb`o;`{_`Cc!9%6j>CwC`WRV*toRm3CCPKV#QjMb9IB0!}S#F@w3_p48A>*`vWK%5cqm0ZN3D>>= z&Hn0e%RF0snB#zzzDBV_D&MIW3~nY&78<;hE<11H5TwXc<|xdkK>@K$&GfZlkdnmY zfK!7ay^L{prSmZ%b6{7@EbNcjjy~H<{-%A{jQ0eg=&3%<{a{4!BNE)QVOOp(-fKCP z{SA+lNSSMqL?8Izz`yX}IK@jn`(jOb!W;X9D52|LUf{#nD7XWuj3`#nb{3~giCTJ`SMQz*hvr48HcAF1QyY1K`wS>@Ud1I7Y4H}v|HjzoEkic(_} z{-?mnh*~sqGhdlHZ?sI7ZrOSFtKU%?lL7Edv_Bn@_cl?$GBrH~op}=Jo$XtRj6}Wu zbYV}z$T!iWxvDu;pNRe3|MWqorwV&1+hxFn8NLi2Xb0}R#@Brr9jV*xz{ z&c~*uTAMrUvK)6%{@DJJ*^tsO#$u4I;oi4!Gug8|i{;l$c2$J`83IyRSQ<#!iVzI! zC6|a}>mKCuHh$P&TBX@%$l)3;HrPaa&CGOXME~o#-7EUeE;n3l-F zB9bYqu^rRigQR}n3aj5}B(n<_=%vmaD_snhRgZ%2KN5CB3kQJJV@`b+mibL0WM#v` zebhdtJ6Aw&p9|{!FK*}mKkfc6H*Y|gz|oiZu#SvYI9WqPIlyY;ho7)i0LpCq|NnP$ z!SRS2($oO+Rvv?T!D7z0PW^-5BV8tR7M~D6e{acqT_yv;r3U(-2H!P;)W3=6e0;Cr z(4TMj=SwzOPL*{#cmz7f|DPrX&jJj_M65x?R8tUIeIU(sE160k0j`0$_S4EOtJjs5 zmXw7gxmWM)o}2$U{%4|l(}DpcRi}q+!6(4wIz86$2N4755trc2L*EZQ^4Sp^O;EKU zLtLtn7B`Ez0IZ|&3Z{Do0Ca&jjfOQ8yUzn*m43dr2r@92iZrH$4y4O?db^j@oXs#l z|Mu6n%fb_ECv6+c@+WYt5;1DUZnHqLj$V3k1;0W=nzgqFJtcyU-1{qcj@Y!|%kcd{ zBmRy5Q-Ic^V;MxjY0$L5S@R)Gz`7+Yrz`#v5sSyu#6;-9-gdILZv+Xcu+377BTrB? zMouE8;2KicfSdy)G{j#{hl>=&4cWNwI*C9!e*7N#fRH4+pC%^Y`^ui~%*1(xg`Z>D z!teHXxiEMy=8)fE#B4%dJ|7+aC{7 zJs4TDOLMnT>PhTk+f{Bk0qPC;f^~w{in0$l*SklbxmlW!u-9C|<+a*FZib)<9E2fr zp;%T3S*UiRS@}xaiDtVw%bIc)#Nq-t#A8h7YFl%xLaPT-K{g^GSM(({S9l;rbQOY0 zt;0##dK2t;Y;#y5oA-!b_bGB&s|TiSX|I^$F-#_qk)|^hn&E6<^W)M>b7VLK%Mai{|e;1YH6e_bdJrt?W%(AO=4;dFqfPgj6qIg zq7Us9{b0J?M!;Med;Wr46Q~$Os3`j zMC`RsU%#Q3-TV>C9R@Mk_xHSbv87-gWCPnoa|s$UJh3W5yg+{`I}VKzh);oIfUhi>TbEhsSd~dc1q)pTjkkY8CQOFwD3ppH>c@7 zb&^XyVPy0Ts3P7$yf^e19h%O*P>+Tk^ThNINK6ZL0-N$S()K*T+*s1T0rzY6T$Op% z)2UVEZi@o;Oljtd`~qh)`X8a!TJzEGe45QQW5?>e^IE_(gm*-5eag(V?g$+7jb}8Z zJK^;Q4cIoOQB;PUF=I^c)xj>hXV93T-a6#`!Pwcq>NJTJhyOX?ILtGV8#-ND_qnzd z`%kX-eEX&0^6{crLD!#OwidM^S3q%<7rL~jy$2IdCvQkPLD>Bb^~kcoKOC{P!dGYw zv>^C5PJOgr^m^Y<49}~(9|8!*`70yk3)WNChkeLbq&p4L)qfO2mgl{%nO@4l?;i)E zGvmAn_&9Wy#L7EP<+So7Y0Y+8F05f%C;(280#e9@_1D4{diT=wvm6(O#iw2jGl~0e zba!pqC!q(_0PvyZ9O4vUkZE#_WbS1~|8H=1d(Cd&*VD@vu3Sp~J2a&^lmC?CL|g-` z$~+<@J5sWY_qI4-T_N->w9H<7QY1nbc28hNu16dvkeI~ed_5ip_znVW!qR0lLB%S~HZ7HmniscWpF3(f%}2YKPeCH(V1~WA+EN z20R%iA~^5_3|G9xnI1n(^D6{JU|TG*!s#xt@@i1mUz@jntuBr5_sD+Akp|)Wrk$rQ z3e|(H9rX2t93td|2+ws=-*7XY7sAc+al-aD6#6`ibf3{iDC9&}L4v;+@>+8pVEa@v zpM^aeWPOaq7ah+#V??qEwT#Om@v7wFv>&yKi0;1Kav#Dxfbk_oPLt7GCfl8?L`|2g z#U?-#Lhg04yc^WiEEt9=MJ#(|xJ-eN6WO*+>BwDGm?JmpN&XiWz!$VlJW7VhPVA?3m0u(f+b60?)}7Gy!6Xy*wJmDemzmcS898v8>^c=N2&{4EE+ zW!4~6<1x#G!SV8%nRXxsOGEA;F#eU}Fz+}w$Sx$_Kz9l^hXa_fo$G-FA;KO_aL%#+ zEsH~0s>Mq}ON^WV2}C8J+g5RM?1zKTa>`Er;EMtbGrc{J0AH_JVsP{xRfqZvbCwXK zXc&~BP`*2BG061En=Ju#73ZA<)&c|~XFZcvLgsk^nNR;_Z4*}>lnM}OM5~Do8UOp= za>>D#?v-~2Y^d(h-gn|kJ`!8C?*P>`YK70Un@;Odd2=r1sFWljC>yA|l*HKOd za-dyv4p=ULqlo?I@2R|AFmlcTje@E z_-*E~45kBMG11KEQ<9(67uQzeKp28WDC;#3vU0Ev4?=8n;KJ&$O^kX_ve0&hoxCPf zksaC%^~RWdm58Q*4C+vWvZOx59(aL`!kJ1VC9Vm00C;C@S>}E-Q8U$ulSoWKS?+1P zQqynVr<1^i9z7Mai1Sz?;Qf&|lzSSXLNDPdu2Kj*)&?Y$!L4IQB$%~V@zh3rE(IZ(`7 zE}{@rg&+qdTFCOY8y2krJ)%jeaq^0Ar>CT=l^c4zCL7U0p%N6x_BVl>BlvD0g?1B1 z#jT%ahuanGVw09}=$fWzD_y4QhvO9Uq;qQXXd6Kr8JA7x z(4~r=K)oaWVsE>Gt9To%kEWw;1h2GU}KZJ#>_DW)qXa);lZS z;xdjQGzmg)4v?{a1T8c@8cLuNJIQL6mUueBDdtP;8#}B?95(+g4-Rs!_^@UG!@wYU zFA}OHTVFF?a$?ji?}xWSl5Qqm4Yqx@MqJ0>d33OKRc#8MW%I?qzrGO~fX^6ArM;D6 zEWBjI6FFq?@hgKW)Zcrd?s9n2AP(-Wj1nceL4J%-;x~KmJY2%D)bg9F7YA{RR^Q*G z$gvSP9HSP;Ov7UhHm-8Z7b$!8;6fYUwCty%dW+X4jKX)SE?e$*U7T}}T>I+x9Z|(S ziPo9}jmg>#f^uR?x^Gn9{?6HSC2p(0?myY2xPQjZ=i1DvZZuRRIE|IwM-;|%=5@q$ ziV_-QnX^clYeKmsfyZNN967)EC$r_VEEJ1(?a+V@3w~N(^~cVqEYk~W6IaZ%V|1$q z$Dy#tGhS!v8*41?xG*p+hMX{zCem5=I9p;7DU%DlOs2j7(Z{r&{g%J3D9OAVRb4@~#m z7}m;Ge-!zu8)`9{)R(bh7x6|mD0blgm&hOz6d-$>pawKkv%({1wLr- zTy|!b!A%3_J`TnJkyOzlLig?(ZNvO9vU3t)TiV5&8ECzzZM zI0AgWeg^HDFv?1Qu?s`pZ`vZ>s&1BbOupuM@L!i_tL|t*Ojo*0@MO$8Hl7xI)lh;! zp0B_uARkIGk305h$41M_ff2zkC(;#vDDg%8YJdi)kJI-&#XzM?N(5mR>BSHK#&f%X zmk~G-KvYRyjU+YcAF7KqWN556*TS6{6x?_cV`(3^zUiExaD6YuE;%jgR)V|?m#ewX zHS3MN3Q5hj6njeNiI-Zliq}qWd@m?#oQ{<{WYF&Dn@^q-*kz=?{}{Bf!#lWAbW&{w z)ZR4|Q?88zov!bU6-+!4CHfOsMVMvnFMW;))Ii>R;8F_oI z3n%Lp=Fhx90la2=uisMEEH?F9#wML?^`qL;gYh3Ih7^IUP`4EMqs)!M;s4yU_McN! zY?5lV(h#k0<7|qml$B}vN_FSi-F{R)>yD4@u-%^ZZ)UIqM)=!HbjEgWr?eI}_qb)N zd=fc)7(^TwUrWn&p6BK#?P7+v#HZvQSw&SFzqx`j|LH8ESH0Je!&qV_pCCnBrL+tAuqi%tQE{U(0y? zljm*cMZZOVHv5iI!XR{@+110zT_=w(=0(ybXrk^7@r#Ffn~HuR*x6Md?CI5{;ZGmO zuBiW1XK6AD90`zBUK{RGdyA0K<)&_mJq(LxKJw;b{H=9pnpgI$m+!?sZ`qoU<$i6Q*|Wn%>Vv*g6Q|=}H+qB*)F*_QwfT2sHwsdFW%?Z|Ns^g#>#>IXks7=t;T4)r*2EITNYxXlqV# zMVs%4{qiO&YBDuX?*0Me69RSF=HIn4l-m&xIO2#6D1Wz-uyFr_&!r@|)h{9X|2C>1cd&?A_lHiKdi|QrjRWsX< zmDtwwY`G+bm*-bA9+CC-ypf{&Dki^^!gZ|N*`y@ zeOLQON*nw>87Nq(3=8{`l}@bqYAfF0z+@J`$wP>OD>(S86Yeug#Pn+nDYO1EFfI)@ ztT5m9II>J=v|3Qepr|nM$dD!5S>{%KkC5$ADv=s4?ZxOmeXh^!?sHyj`azn^XWWth z=n`(fM$;i%uKHo1W|!_-s-rKXM1Rj0w$86Lmvg6RCH|ETbDwSZd=~vOCa|)+QdH{O zY&v@dBl#p`O!J<3 zOiap%EiF|eTMk8cMyGp;A8EJKdorvjwt@Q|IWg+eP1+gKyvR#T=jyG~Eh`x$4&!y2h$HKrA6;xofxYd5-S)k2cfY z5+}2Ky16u{Mlpv*9Y2NJUW3UfOmmYZ*;E-lL&LBrJ>}H)X^S1y@aO|Ed4&ygHjU{^ z2)Zj$M?T?3UZK^E+&v>4uS_O(JJfcc6goWO`A6wa=lJ*Rn9gydds#(6IZ9S(4NrhMj|{ia=`K++ zV>n7RN^@E`_mA1{VUia^(buGARWNiir?xUa)=f3u@Q?2jF7J%(y6X9=!8V-Tj=#Ti z$c4qMBj8(rLDt=BgWrs|4~r7Q)|Su}f3aV=J!>A}={PIim=G}AG8I>OBe~;pAg80N zjNqP{9sh*|n4PTA+*=S6_TOJ?%RjX#hvVNFw2a;eSeEMgI<962Kdp@@Ym(j7^89MH zwSi@<86D}@y*}CPK9}}p<%V9#!+N~=TiqP0|Zj~4Z zn_w+wito_G!%lY1x}LjgJCjc!Y={$trln|l};OO?&ycmA8D)j<=-PZ!vvJ!8jMztH2esZWNeS`Xt-f> zO6HDhdJ2kax^KGE^i<1^U7=dF3+dEXs(FexJZh2(lN}*RJD*Z!@Bdc(S&Kyy(_keE=$fH z{yL|f_x<+vzCf@AgE##1JWjvh)JeU(D$Cbp8x%TUwRbmsrXDm+72)J)Q+TOY)huNu z66}6mqQji!x#$hJa)i-R+1-@^x8N=W>SPV+QhTIjn&i{5fm@5evez5T4)KfaoHLK; z8!Q4AHbQ^4+iv~C;hO3R=_y9mDgWlIb0BO+EmDlA?eQO^gj&%jw=;WosWK?JAI=@W zuk(3Hvq9(F+LS)uWpqWJLo@QOvTF(D)7Wrov(3I=#edHu=ArSG;2**5v{}%NkP`*{JjZInR z6o4|2KKTbw9Q~2gJr78RqF!anFS@7=9`NU^{1$sI+BA5oeFdFQ(2kvp7=1U|dk7np zJr&hfR&#L0oaOkYXvu!qu3vts{07=tC4cUh%l&6umD}Y0)E{_rn6Y6F zgyZPJ1bRY%pHi3uIyI=rT(+vXw7iS&<7-j<17+}F-=!&l^@%~IhKFn#8e)Of^#{n_ zN=FDfRX5*#`<>;$LH1AsjxNrb<@&JzQI+E=qF)?pk3g7Sv)%MM!|u4@qkN_K#HsA# zf`$W2mANt6#ec#b1Lx#T_t~GD8La!@?C@O4e)w8X{sdULww=oNL*l^iK=eO&;Zt;~#BfvdzUw?%b^AdU2noQQ-2I z=o1w2^K!iiYb7h8Z=qM+KEKmK7n5F(^S~bQag5sJ!4s2CutdA83lQfxpY01lXZVy@ z>IUf^AR77~D1 zd*&+}X1D!kc&;UK#zw^n@$MMBTWND@UMFBpk7&=;_pf&CIWwG!S55Vb?*Z%ciLjT!}9RsyV~Y)<%Ln0|gaWQsYzVAEM488%pa zP8l|gF={CW_0J5_jl4*A%ZEh^whsT88^~F&ldy?YqZUCQ&(Je8PG*n2*6lgf>7p!l ziEc7?JNwC=^X}p)oucP08$Offhc2nprZcYOReKLQC(M`?zq$$BewyCl-XzSZ)U_#! z`yeG7|2~$UHcUGlVzd15W!3WKTussEF%HAQiJBY2*Q$QmkiE_(?->i$o`3E@n)2{Eg;EWIxM!%b2ZgB#y_uopcXd7%X`dQSF@&KOz8(ef)Bn&@>V-$o~- znSOnIbyRujt)b3TbnT$J@!EM75h*FTPfrOcsY=pIzeS3uQvT~xQi(5>kDu51Y+3gq z{`ccG6zTzP8(tEvardxAwieibAuYFLWv&iG|6w_=V_s^xHJ^YK8*Ki`;HO^UUIb0@ zZpngI`r<}@sNvQsHA(u)ce!YN;@vnw9!x8-FMmAzy;9Qg8u?|WnBwwhZ?=J*?s89C zp8bwpOzjrXjGWuvd-r-nGtWh5cL|r&^5QkEyt&HD7F8BG59c*X`J6jFG*~%qj2=ni zN}|4=>UdxlxYL`ypj;y2Le zt6TU_YYKW!;H%vntC%+O}GF>VCGx zcJK%0etx?+KU#dS$x_yt#jS)m;jMw1eGcGQUHowQ-6&(qT z8094K3KOaNf`%mqKWK*|#4gBP198t%N{u0X9RBEc<{{s{g$4WI$TG&yy!GvFQ-=qN z|B4ESId>~hbd6U_3Z%l+MewdFx(Y*{ad>@#m50-P;7hH#CJ}nQZxJ^1F z_S~9u*-kGS8~B>~XkF~leZ)aXXoQ%aTY=p!meH@d_c;l|l65Dv#U*ueZp`Au!UcZB z*$v4VO)bu+!y!}o9K#pdLbys2a8h$FjX~hCby)N2PM>G^wZnYp4~&|gxKwTAq*Ygb zHX^IbedlN{QO^YJIP7~PMsJCWoKM*Gm)}s5{LaxMayQfdbHr^1cReSG_>ErY|K&2J zbv7$XOAyu&2Xpgvua{7zZ0Aw?xFmvH0rVNUpnZOQCvg9kVH`%FT#`?yAqE_!wP#5L z=pkB_6mSD~wy*u~BoSx@4e)zlPHdLQrHYEB^!Oqb(-P zD2NyW@ee+<5ws}!9iTvqm};LPv4N9UCu@&pDU0HzJ-Ga_%h%$L=vA;C)XieKgD~{eeFmx9q@XbHH^GHK z#b60(BcXVIz=L$dQUAr_{|4THtkHexfWlXv8aT482cEdmo)SY=?m8Yh$HCh3MEXJ` zh+v>>1U-G8A8i+!VRQ|x;7C(~F+8=r(m4h{KiaY!AacWGZK&Y$-9}? zizGu_T}1eI#9gwytFYA7R}$87+aJWOywEQ}gBRjRlKBsMi)@_pkcDLDJl?u&xA92^ zaqS-@K}lZ31(~1xuRy$?G-DS3KII5L(`e`Q%=H!>&~33>a@2uZQO&lXbg>_nXJ>ZJ zhPpeK`w-15gw702qYG}zPO$)40bvEYdcR z%rl4+^<3^tH1^~jHiY1F6wG~8AdEP#4P4}$D~^fzZP;<1l)@M=aj+ z`Cf60e&{fXObq#w{vO!hc@;v2Foq5r%y6-51WX>&w9?*M2cgSPjpQZ;wmTH#?1^YM zE!@Lxw|&tHp(5^nq|X*_)|X-%W)ARHQS&XCOV5TCIe;#u$jyQ?MCYd_bQ&@pY#0Xv zt}$8MicD^4Dr%H8dGo(XRA>k7~pf=QA$w`H{ON%NH>m1}Q}HS$3} zszGTR(T8utl({s|!9tm-XBFFjVF9bRH#x!KvV_Kx=P`&q&4e`oZ}tpR6{grNm5~`F zG67!Bq&<^fDEt>NKlFue(5Zr)rpnKw0R-g;+L4FIBe?p2X~XJlg4Y?vPP75iZlVOY z1bZuaD^`yyy3Db|LW{lcRt4}@J#tv}#y;iX7T%~xr`)FjLp=#3ZsTLob}rO!gZX#Icf_4s`GZ><@LhQ_{5ZZ~c&wq=|wRIyL*^fE3}xEM36$1Bqutadpu0#@0;J=hP(m zwD{Vwcnn~$PvJ(Vc%M{=d_&GUXPDq*)d;0$GJ*9659@D{R-H}Uv4R~I-%VRHNY^nc zPS9B-g5A1Qt12QTmr;vxx9AP=XT)w{tK4pctOc2Z4|*G++G~Qi+NBG+VWzX3GURh< z@VdTu-+gDrDt6i9`uT`xD*;n!z66yhA;ST^07)pk>W$Q}1uaYbca8>%nO2i3v1zhV z%_&nviaCTCJgPJ%+69_gbeyLb#Mkvbr8Hj*b%w4@h#L zQAQZ?PeTP(7kD1gPPn4c zB|;e>3m}Y5FqgQh42 z8X*F2oLIh*lhc^ahC}v=`@KH7y!-TgU(Ztakp$EU$#>1f92=*vUNfC-QnUnnRnOQ| z>5?>D3utf*TKX@;Fc!A&4@XlLM+7QyA<~qv=6Gfb+!ZucHLM!k=o?jxJMs#ViMyo9 zd|l}Hi<(QW99Z2#gs8zc}ax8#9J*1u3q7?G2V}z86!W`Y8iT~hHyLmeg()@&ax3Z7_@Nmz^j9k z09Xn+opAj9I{ukRfckqI4He8OxYpT9kQ4I`%tt0seuxr=3Y%K@@+?zlDz?Y z5Xt>#zWJZAGZ~TQghB!(RCM4!cPQf4mJ8Dq>{W2W=3YtIXJ?j?5~G7-BjspcUd7Uy znFf5+!pE??s#KsT;|L$~#H}DI8Q0|m_8<(6P>QVvonH0x9ADT`<-G$B)X_X0y!iNv zxH6&m`@Ht;O)$^6Q|M6Q&Tw|(5&9hl0szk( zg*_PO@)!yREN#T4Eto`tW{Ex=Mq)l0A`+AMSJzRBlmCYwhN#6BC?6g_d_~A3u86%rd89-UcNigACO#BhFwx}z zS0J)_T~6}+h33r~M&xF;y#FSPUN{zY-3b?x5p6rmIrJ#RjYRNWjMxk$>_cQhEY~QM zve!O7elsQ{uuI6o{@Z)zIHM}fa>|BctV5`r1gD6e6&6H%BUoJ$1v{`A0mBj3M#BGs z9Ui&q4K9-$!|t$i^~b}2?_>u3XR*UbAhlS&W!M*dsMhhQ?SF=_Vh-Jtk%YxKrjwBR zjxgKf^I#jp&-@)aJdzbe+EVAG56I?eu9vM-65*j8QjS=_&dQfl)edfpxS2{trUF(e zgf$>n!JRmhTr5NQm~}HgSn5DGohBmLA2di=3h( z#D_|-)3287N|(;WfcAphY{ly;&v$0TiRDMe<385Pj{r_Akm?q zHbBJcj%&UK0&&^2==poA(ImGJaX;#Ya6B1W*Z~P_nrgo}bu+(!g-SXB&)*W13DrW0 zr{MkO>QY^d`JpHt#rJ#EAX`>93zuq-y~Fz-GUOX=-dx>8l_UMOv_exLR6t0(h>#hy zrAYn|WsMrAY)*W~vS1N3ld<g8iMFzTs_OoeALBlDDn<5o%ePnuG~v|~(rekiK%32xMWXukd9)1B%G7Z6a+J5X@-`R0T;;FYl+7zdjyG^(6F+EAL#$=*u@C3;e4f z*ypz~tb(`FY(-xj0h8IH@_51N7ziV7Gx01HB*XTYPFi{8YIy_I2SGBKKzU#ez+7rJ0>g?S3+xu9L+SJLs3 zTLDp7aUn4#mIa7(NOPODb?}M~x7#Sn6SbOVI|Ah;x*hu8fo#_%eHNec4=h>3GT{|B zN7m+UB>(K_i(W4v`%-y;E9~;HMvVe(lV(k*`nG(E`3$-aRoerB-Z;?iCv%Q4x|~pEQZci^m4ROc1!n6 ze$ckx;06dn!`L=_TgGnXN5J)qf0y$@b=jnvF!0R$X$w*GBle+#Y~?u>{E@ag`Xg;a zvTDJ@zw)Q6YqvedP^)+}f#ObSYIIXl6Z(KAFY#u=!2wJ{XC==Y+( zTA#=jLwZ1xrW#OVV>3En;3dbXEBu}sgbIhUSG}r=oknrSXd3}Me~fl`j+Pwln#AUx z{vq#P;&FL-stolp^>Jch>|?XN7mjIihT{q{jW}6NzQ!@j)U2oS85Z6a2`1I(L9> zlFpRd1oA$io*ZTg5Nuk77Qoi>&b`F^%YEfIB&hp`EMq*N#iH;)Kh1!jd-y=-+&ei} z?dQ>E3BtTqAtu~YL}|C&%ze+qRy9i_jy!gSqOR=A<1X zjx^KD>_(Kq%;QHJ=7_LSLtf2?fV&RFV={m6}~1Oy=N+ms^a&2@vg3rZdEN8 z`R4*)h$@9_V)iZ`k6zDrWp>b@@1*qc!@qEb%-YWbFZLWq=>60obc~-bN}kc zl{8H&8Q#dO6d*GeN}keuOvI%rQQqoL(>UPi>9ly{sXQzm;7E~e@@RQqTwVCL-B`5e zjmL>RO`2`NmGfOde2)b@b}%&V$IGFxMHKN_KQT8{j+D?}Bt%d{8q8PhIC9^x2|8{b z-2Gs&Xz)J|42?jV`ilbRsrdKLXM5vFIwWVFl3DMN;zXastZPRqACdl`vGiDU8CYw% zDk1G#o-9$#J_UJe#36{0uKYpv zHe`v9T71<8xEC$N%hMxX^NS_Dpy`=PY)a{+dUD*M6e+-kP{bEV8>FHom2by<-t@|P zga_~o=MMOLaIKs=BE?X#MQxfKc{1Xa!rLXH(F}z_p9svM%OD=G3#oL|juYpqG{)Nf zUy9$(3i;{qn#Yx91>^8kcATyrS*y96p+(*1I%ZY#iTrFY?i#MQMX-)VOR6~1%v`UI z8O@tUyN%sK8&~)ZnA|eYN}8kT$~3epvA7{wdCMIR5C2JaozVhXM6wWXhgK?mCGv)B zdM(8es)h9XS?>7ZukyyAJTvq-q}8LzRaIj#Io9NRParY&4mZ$^mZ4S!jKDwq;-_)yWv-I`<#HR8hx&f1;PznoG^Z>jL_e& z;t7V(D5#!{VnogWvQ1t{J|7&5K?HpRkdT6wK<>jJA{A)$AqZvQ?7i*Yh8BT38e4lB zkC7NwjuA<6QyoW!dG6!uwv8$h!MqaIvi&AMwgJL;;?mEzune=Z-MDeO=X9SLf zdFAMbBKn4V;1o%nR|X$NXRGE4!k%PZayJVooJfzG0AN3~nd%`z0!8Cy^a2HGAH90n z|H1-pFsRKo62mu&11sYTENLj*>M44<*By&mx*c^DEY-K0XNSc2)AUF6QgX*|%PahnBl4 zK!qt{4FvJ4h+*cJ0{o08-u*w1b^f1DKKA2PS zFJY7krnCS2ul-)c$NRr@FZ}wx9*M&M{iH5j00RBfc?3%i%{fd=ofuq*xEH3SCvY1& z`Fn6!6O+2-U3Bo~!RUU8>6vMXw~)D4ni#k+`Oa#e%eB}!(smj283s7YlbOOKbaQA1 zCrc_N590Q5Oo@Og|I+^l8|#y!@VQ;hczP0-8zbk2u)10mvwR7GzFkN1PgNja2NC|b zGv}X+k5w>ZVQ!w+?zf45r--Hx$V?GNL&#?kEvc2>X%!5}#mo4<&b55xoO$S4E7EJuS$s`6pe!8N7$P8np1?)3R`a%lz^vHe z&qQa>wISe`cKu4Gg%QH9N}u`HuR3fcJ%KQ-v*xHLm6aQIp28jII;NK(RebIjHF9&N1LTi~Ah2~3hO zX*t}+kXk+W3s9852d3hb?^NshE+O@6Uih2^;xFXsIyJzqfJnvb!rl8LM**8VAkJaa z5_k!475A4&Z5AGQ{+MF_ps7!W`wVg8Tz1^WAyKq%moTE?@+1+gHUa^x>_DzVZW-2B z=n}!dR|oeS+WC=b8e@qogu#4(VS=oKT9d+vuZ$;-(|O=` zm64K$6Q?nk<0fH$li{v!Kwp|4bbA|pev08*zJjrFJCW0fErJ}rUy-yZihVY%m=tJH zjbb&*Oy+4i^P8~d0tX?0a$OHJ24lJbmjLXhP?OaXee!|%|7M)ix&Pf51{BH{0%WfL z_s$+xZhhhsq0NNP#4;U%m5|Nbc9FPvZxDmd(SH0xp#r8#0){bxh%>s}rhC^Jcp24% z2pY|6M`XJJPEdG7s)I3H3yK7La=37K@59WA;8ajztqi!JO1!IENq=-wk5@e2edagf z7Q%Cf^>1M07gZ(n=0%%B{yfJ14z8u`D8v$Edx+he`so1c_SdVbb-h1n{hi8se)mt44}B~$Lx$l*5OVsp`)@!;8N6x4tEn^%26`{EcOS+wl0zFhYfn1C?Y}qbP2ti%> zdw8R_pzch*)i0m_Sn*cXHy5TQYB{WtkjTV1GI@Xy#2Hh?eC=U%2rNn!OPY6Qu?q={ z^ONe=6Mzjy=Cb#G(hsm8csv2wCVgL0SOowYie(}>sUEM8BPe{kPUu>leEX!nx#(ky z+50Xr42;{ss)UBJzlVu-v@pgepKFppg$eoN4S?J^&3>>G#od~EQqEG^9*t8wv=2CT zvfT>m8p-n_E0KssaL(G9@!faMN`9m@ymMi#mDBokr6_5ratO;=$k2utHA1J*DLtOS zsSVh#C_oGTTOz-9k~=4OIPQ2pW4%WOk$PAjhL$pu?wF$(DNzLO6E65Vo+*&_c~eELtee2MF}pXHcrHWD zX1;janDhP3agp(N$GgF&EKs7i9l8|dlckos=QrgOc)%*K zChWbG;+X|bvz?e^SgJ+)43VTFE#EGx6?NN> zMxNIh*oN{85orf&*jeX#54$rUR;rodvsUP zxAl{2TT7f&k)b)D=?s9o*YNlSOda@yM?uO~AD5E}Qa`Wt&H+W3r8GhWK%OZ|d-JvW zJ#Cf{7kDYP&xtZ`*njh1EktkLYAzXi+o|v=b!(|Ob1Oyu;)kqqhlbV)eGvL!4G*J zHr(W+jC*_US_812hUMunQo>o(fpW^BPyG0J+3x#%Pu(@o5`^}_#`4L@{gK^4TtN2z5`>`~(aEMmh{S`Q?<>AO z`zxW0K)T?-Daqx9%(;&>@`CL+ej}o<0NZ0sAX88qH@%It*|~OlK8W-scmPPs1Ye?o z#7f|4)PBQ*D{k)fpqwNh<;aokm6X0Vi35^IJYe|;EL}MAIPq(c`1#l#*lwWX+B&DB z{{;OmG&pQO{L$rer@=E~l_jYk9odOc`OnZ(pavC>E~nofm{hM?US3v?3$N!_lVkPD z*sjVV=l$Xmds~lokK;@CisFfRF0U8sUUDCXK#^1WF?Stl(K^z3se9m5Pn%1TPGa@g zT-nGeyZ+=FyXwj*kG-b-LPo2_EP)+DmT@acM@Nlv?? z*TwDKJNov=v)NSE(X0j~^c?Z_I~OyTQu;Vm@xpLsswc~}MspPZ&EOA)bsS%s1aC->q8+D2 z{2*I>IXT!?1bx3A%dO+(8u(Axw(k+HvTHSbVlj2VJvt6s8PPuKe zSJWA;cHVgYNTOn0lPkC!p8Qk4P;&^t*ZCK+0Xm(2_+D*CNmbiG#Qa1!efM_%(uTdq^G|L$d4~r{_|@98@8WUs#Cxg~ za5KD(4&-9YF6*}kifzvHRIYO5)LaX==>z|hlI%;K#NF_1e9hRK0}-yzW_#e#BR75j zhEoV}a4V+X>_^)@@aQfYPt%Qro*-gosNv|L>l#n%2%|Em=#|ntPiL-fu73)DGtWpZ z_T{JpH!_k&6jGy($;>yb9I^_SYW3*7yVmUHu*axBhLu}CKbC#4z0E0bmA77*P2+gy zx5|(c$_51YrLHXA1m)}++v}$e2`XtF=JL&sn^YDX%X&MRbS`7;n));GnO1yJz{yOJ z92}dsJ8#KeD#6EGsfR(zX#p&0&R42ISIGTH;E z=b{nL)f`_u#J)c;;_-T|b)~28L-qGTmR%ewe~s%f2W?jV(`LGlU&FRDV?8)}w;emW z$=JB^cSBem3!kVBm^wkErF~WDE^<{v)|9euUM{(BYAa_?zwE&>lLD41?eZ?#VmWoR-CXfx53m*R48s z@1kshbW*qQlbDuWN8S|7U_d*ro$+9kxV!Oi4UxF4N#DDe^S+`gH#x0D)N%BS+BzL{ zdpGA4E;NMWP@7hfI|k@9+Br|K^z6<{nxXERSESx6Y!V&ZpL0)+J0g=%>A3GuYI?a| zKqJ(>Z1?FMt)c#pwIfeIR9!MIQ;obHqh-J2Qm9S-P(1ng2lc(!k|L_ZYM=JHj^4s4 z+i=-r)9$;scE{x{O+_x(8tqnE&7>hTuhA6qOmsNt+Oq>R6|ET0A zqs7^BKPYfLECaSfajzfd@!dA96H5qhI3AUz`b~aCi^ORSbFI`g6-J!#juhmwKiwBt zL2>|Z4ay{Jf7sSz_ttElAICX*^)F7cG6n8|SBJsAzf3nfVk-NhQs7}`=J!yEx8vtD z-l$Z5tvC;mYAGi4@M~s$j-}nf4t+^g!>%sa@kNFpe)ae-iW>)jU z(n&r4!~J40QWdpJn)(hLvZtp8f;RZo?hpHsyn}UavTWavC)TfCmFh+vmbNeE`TbFO zJ$ZT?v`{hwul%LykNLM!9{x-uqr;#;EEPA4*M0vyi}T-W*I{J!V>_3`0N zuh;YWc-+Tr-0y1vOz9YvFqJ&Y$hh^0CN?DJ@i zIqUu-eW`7`zn!v&a8}*I@Sxegg=zO*6Bmh}oQ#HzVFvP+kFJd9xU4x21m{Lfgm`$0 z+l*+7;N+zdpBhzI{wZn*41NP1|sc*py=k9+@Kj)^^ zy#MlmeX_pFxcJ@siW)p*i4`l9b;VT8OZ(@@3WH3%eN` zNuhJLk8_M9Y|c0A>3@HPSa5`r=kI`HmbTR%lbfd-(tfVM4K#XyJe_85+>U1HpH#0L zqa4$2wb32g)#_e#yy&Jot3(68F)O#G~4Suk5s#*KbUxIvJMw^gjRP0-BzO z)xi(8tL-;$uF~ax`r}M${hio1)Q*cN()huq%9*dR>`IpPoEPm-c%J;{Cx=00PwY>}p}U^U1w!s}4EA?+bvT)Y2pzY1 zKJHu6r9Wr+)Ox#`=wW*Q#Sx4tu@izZ8YT}to5T%#w)W5s-5Y%$p(is?Vi8CKYgzEBef`<%=3odyFnz6ka5Wv-TW584;XXtT@z>*Iyew3;~m z!H@6Hw(7ZA1=8{VdwMvMI!cp&-Vpe@g5b-eK1pj-B}QAqt5QgE@ca+=ezm5AP1RVp z0FPVl8D6m-K%)KJsW6i0ZSp|5V4HJFN!_B>$h9g>VRzN|t+9bJX1_{In~2|N8rtvZ zAxHW5X?%K;m;y1jW@A32WkLP;>b6tK3!q?;^!_P~~D;>{EFbrBxZiowlH zQYA>Z>xirQifVs|4UqaGHk&g)?buq#v0hL+>(D3V11e$a2^OBeU-oO=(q2E3NgW$9 zFHBAL&^r$$xuisJP(z*VuNbEwzdb71Ave`bBl=aFFQSoOwnxL)5k(ez`vCu^VdU5t zF6w)=?pagehlScMEKt4OcyTJ&F>~|4CzE>jH?Q|mGTq+0{C=wn6U7^Dj4hiuuU3-k z-tOA;cAR;7Am1sVgm$j%t%ya~oheDFJwM4+-cN7IpRS*^e?t9z6|*9H(jP=;dR+Gl zJgl81c{Vt5k0{+$N0q|2LL=MLRR^*<9%O|sJhl+)5#|_hMq<((B{475X5ao$LT6OdGteWE~zH4Qk?7wC6U)WvyJ3eG3 z{1B*mGpiR>a>?57@0wcgRzJn$WQ5FUivCv+m|j`3NO(@^$=(^8*Z6dYu)q^kqXdX0 z|Fd1PQ+6r?(%|N!r+QSlgMxC@AOOcSHzg*?8%h#9#_zO`emc_8101_$lgl-MBIBR= zmlu&wl@_z1@G@HOQM(_n-8_$T{h&fgIYLOVJ!Vk<+7usK_Md`u*J~(DX7nehJ`}g3 zM0kPTuy&!I5>TG4-!;>OvD0}+huu#lyxdB4(ufqw98WTLof&-g&8t(Mfo@NvJ6f;O z9oZl0Y9i@-q%+>1({9$G9-Ml(N%fzHU0Ms)4w)a&1AIseL_hxA)Mz3*yKjD_nIg%X7A32X$XmnW# z6LJ{V?fE>65FhPJPdqr zUWzgP*=U^J@F&N3=lCJle-3Xb`qP;V(}=PBy|*VKV3A+LvZZAu`r@4Z5|88Al*5TH zflaEsy;#Tp*r6uwkWvlZX)C>J9T6tK3e|*4%U#i8F8?K)ubN^v`x+tHai8nmbrrv4 z&$W$_V#Xhqjqeu{%HxFDYMBGh2UHzSt>Ih!%^N31igvDs_wZ%W?fOgd}zt*ei3ygkyGBDUTp^dwJBW&YK8 zoF*}leCyo)JFy98js}zFF~8)Skz5BQSB^F@4@}cb?t}%VdRp6J>tpjcZ-Hgw3V3NY;ycNX3E)*1`R1tfk$m zES6UW?2WFT+M9h>-84caCbIVs91<<)u1!#YKXf8`D(P@p$t_Gii_et)mru_K;qH`PFK^uMX!y}cwZo@2sPTK)A>BC{2*kBO7DMy+0-d`^ZxwU37ab{T7=lWPgzJFg==BwB%e= z?WSdAr<%%PWcXBnV~c6{zp;RY9eYkUj^<+k3yn!`qQd^A$0rhgU7ql472}cYg+lv21Nx1&&qm z6WM2~VaiMqm{FUti?!HU|+se5+xU%= z-V;1_WJK|T`!D%16V+qJRCxs&)4Ugm9rxZJduj_W28sna z?bmP@-bi)K%r;cfO^DK55v|!JeF5Fy@_S0ZZxP%4rtV!W%e3p3p$hWt`NP|vw>1X1Lxe}u{%_2-|5{#_$u&g*oxld8$`n_mv+xvpIqq5lGSQgU5JY?ta_ zYKrOCL&f1`#fe5fljB@{84b6u9e3vW8*nl|SL2kS;aA(MUcR^DuJ@0PP!26Rz5gMSS>r zKPN@jrheyO);{){Uu?88&t>RtTUL1WVpqP*>xde zvM1&J`gX2HP2~ue)-m0qmQCHb45zinq^BkKhN&3O*MqEMBPp zl+1I-C*e58{a353)`jTJZvL_g{E?!c`k*=0BYpaUS)WFSoL>U1yz|q4)XTGPzYSFO zmYaLpP`0&Q%ZAmGm1?om$-Y`Sv3S9w{+O83TDI}mem)mHgMZM3R7xl*bbb~*Ju*zq1xBuAEsnV#2E-G@{DT`Hsgh+0ZoIO@T zCZ@A)Xg9MYWu5SHkHSWaMJi2p9ffk${H=4Vybif{u+m29WyiTaf=R;s8y4TXvPn$0 z*DJ+!WkX0=$T?W3RLI@f-q`rY-Qzz;MUJiuB_CX0{zKt+DK1yY(MqwpVt9<_2Ac#9 zw7}{l>$!w`iEei&4Rc1VN#I!V0Z0WcQ*Ut(fQYlGEb6WF969JF0!D;CY7_)dunXQb z@T@ViPPXUiL}i78i0D?Kk(3gd!r=O{gMO?2iq2|BScFx+AQ7rAnd(o*{5aC?I+DZM z`PS05`>5cX&lY!kp5z(l8?E<}#hEZBk5hW5^ohR@sMlpuxhP0cyPQ9dehGwA)ft)| za_-Q-UiY`2La30TfyF?%IRWN@=TR^X5_@j8qC3)VHlz!w0d}2w^bSY;8qy!b;@<|d z=Aa*0j$8dhgG~s8VDwB^D8lk`05Ln$oqm6~D~@L-YwB=UkKhRLYpjG)#&{;;7YAN% z69%=VuCbHkDgG~yz<#Q_|A+rTLp9Eb6%t2<$&~X@n9*%$UIE&BK3e_?zymDojD*m} z5ayeQD+Cw_LLiR!26X~{#J=MJap4c3%z-`OQ1Fru))XH9dXwZ|=*#fhpZN`>N7rW` zOu!6Wgn%8;ycShd_!H>B382JAVa@bIiDmlk2z<`vXncObOvn$gNq7d=M6W zkmjpwC4lR}h}h-#hPnh48?UQS1wBh=ia58~#Y-rrj#v}VARuV_8G};oR0-a-WTIQy z$h$V zAvoE52y%e2?#FO{=zH+QYFN4sJ32+;jFWFhPSfo-2jcF1sNdV%lUy_a3}1EGUFSJP;zG#j|9aikQaJ1xc;>yLvDXQ79X*}VL%nR9h7hm`uVxC;J3zM(^dAgl@PyFtX&r2nm_+~J z-lKj6)Tq*SZ|jl5LRtvbUE32EpGmcbku6{lACJ68^qMLFMyv8~{YH|T-(3?r=$JFgt0 z1>na2+-U@9{R)|!sQi6MydJ^41JRgsD4t&WrPdcJ_zrg6RIB)8m`wQ_E;cKVCOS+A zC6~<3hJ~*A7%LtT#yAGdl{Vw7#LIh?knM|R>X;N$Cr;Ie_JG?wyn}GqC_4A>XcQ_} z0wczIjnAuu9cBx5LHbb&{Kip-#Y z9SO|mB|JO$*lt)EgO=%&_3b_U3|lcu;;FRvO8Foea8lOET^3RZ)V)#(IBR)Fh2J-0*?j~{T1CSal4>+JR zKG*Vd8X}L5!xT>rH2JpO#*obeA6rYQI2n6GpguKqVilozIubOlH>RB>ThEZ<dUrwii(yt{SFZV#_3Yo9{ZuzbnhW#0c1(4snh~teozi_C9kKQ3Fu5d0D=T?8s z!TNVQFJcJwPkJYT8UCLJ+e`Ga>p?+OvEvQM)-ZCto{$rq&8 zpJ6ZE9nwwxI9tM36=qn{-R{;G&3NU?SP14rWx}L6;%p%;YOARc$K!k%JvJ|!b9~M> zyjNWjO9%(ip!&j?Zul@F!0JL3|Mif6RUFu*N;)3y1xK#JQVX~KY^{(bhCOsYaz}SmuCi#^Ov>i1=TXq{j|y$PZ}q1uLwKOq zZG7N+!>&3l5`Wa=M%_n0dH1etNiG_UoYo~NcyJXd;xV7e&HOy>a=1|^0RT|lS$>d! z6T`r}4VUUiV>NmKNVwx4yf?#=Cr>bUZn&dCC(7oL&iMVYJ?H{PEMfF}-ifva%%=AN zM$A-hoBhvR8L{Ca^>?^XNy}#HG+l#Bp^Mw|0S6YBr?0_s{qw=ZobKY1pE>P0`PqlL zzXvahPFCX+$CqYZn-$niSmbGYFv)8Y5;HOK#P5e+3@;(PcFJxoe40Vh5s&Bpb=)rD zHJq*c@GYFBkU`dJpKOn}9t*HnZauQznVq9`{q5lw*cTW__HOLI3RPM;^_vJ=*gc*p zPu?&03NR2U730DOQ!9Omdl1E4{%Dyj&e7I^l6EIw?8+e zn-WOgePz)3fxFa6BKlg~fs;`=&IEH&FP8;;5YR^hT8`+jBH$*BgS8G0T0*tx+^aQ| zz03h8kFpSP(J}E0wFT@@ld`bBIjPvY?3aWXk}LlQ!g$J~U!a(iHYU!6_iJIwLv>EO zVhv?lKCKgnx`8cdEZOy)xp|2rS8wt@-Z3+CRAb|}XGeE^Ew`X`6?bvU!k0u7)xZU< zyiQqSJGzQit^S~>PpUuemI(*S3A!PeFfmk3dE_WQe$QZo`Tcxjg4j^+xiCQ#BR0Fv z5Vb}E*=}p11~K3Q^+){T4lrf>J`eA$?f(P+LB13`LW$h!aTO)R^bH>8NSkd*eZu}) zxP0nGcmCh}$UGuTs{jA->5-43iAVN$_y4EQl6P>>>imCW0sog*r__2nZWBcIG5D@g z#39LIHc1O(KUAj3&T1EL<9EQ!N0S1m9<&K%<03x%-QsPU7YXBEuuByVHZ%j9gg^rl zw4B5~c!&Qj9P-rl#V=KXSiSV@gXPsvbkvaK*g-AFC;>D*r*jHr!iD~)oYaJV7ngVh zR}~lLLd6pS2V6fq`hajMmmhyzgTdIqF~0%T!C2y(P;07fB|I_w&o`i|>lwTNQSna$sHeZ9 zDo$$q4$~dfCq$Zp7BW###C`Lt$ZvC;R--+skK+xnQ7tqGoRG>`u z0Azop9*Vwx*n`aR^MAXrneJme^r~NTqYCn1qK;+h;Btz;@q1tjjk{gZ*$>2PxG0H6 z@bNFS70)p1;=p;Fk+5Ve$r!+cd^3j35^72#y3@W zUUy7rsYZ1WamwJZ<;x=i@)|dWl48z&-Rszw4O@>3Gt+gHrUj!LXesvV`LdqlZCtt; zxNhH|S-^@j1{bx@!fVpAs}R>n{^AE zPhDSZ9kKhvB<|wQb{>53p22ns96(@(2k*o}p>oJ(69NbR`sBaJxt19oFCjHE2Z@;`~&#&*@$u9h1^JK3htkR#0(K}S?`E9By~>||cN-IT3`mJhufAG&)PahJMvv|} zU78luc`QCjvd@Hgrwqi^;!4@TeH@n`9e}tf_x;8jV#6ldB_9iSKq<%;Z9qV(vG?*``yodsk>@#hQdZtYVA<%K$7Nz#}B>E_y6H8RVXAR~L zW%;ajjcV@u^P#8zi8su(dhyLJ`jaVkd?St(VNvavUs5pc zSoR0^93Jx&LDi|L>%=Oj=d@0 z_a2|y_xu}fHBa~!${G}uw%I%*P{UNB zMT{AsM;>s#!rr-%j3KN(wk^RTauus&U+;5)OGM2?{je_1U>8pUPH4G zI+U^q)&TOY-ySpcIG>12J8>OTBo0{Qa^-HaKDg>VKb$%^M@Y)Nb}^>DPxI&Y4yio3 z6xoHG3pCu~@&{uV0=6jhQH$fDvkL4?vn{l!DoeJ_PjtldCbf4QtThamaM&)ZSfBj2 z$SkjGnY>Wt$J2(rMz`-K`scpilJAg}o1z$JkxhDXvh4ArsJkdRHZP+cFt*k%+Qy)V zI#cOKE#oX89UZ%OfBrF4QTv`YxP)7k`{DK@DYs~$+RV7TpzNL>_gs=Kqm8(5xKL1SbO0w{RHRRO9*>cUwEZ8*R?Rm#9elANi5^ zVgL8lZJz>apC`z$a0D$yK1HnqD1g8Q2;?bmOMpq;Y=~B;_N(!mJNONrdCR0zLZd;E%%gFDdHh|ACC)w<*KlFS3GhGEMptv%1DMMBaGAPAbsQQ$Il1DNntRH#A~>G?e|<2pyUGT)gJ*{ zL(oG4l^}=_6dz$ckH4YRIcAF>h+sYTT9xIJQJI~%&ZV9uT$g^74FD}IA-F|j6ac+l zxKya|JQ$u~z-IxtdZ**^j2$uAfe;U_SAgMx?2zyXpgM_0fRG(l;&uMyfWq7s3kdd5 zWA+cD|I#CHnW)|GhC4%Tg@IYCNGU{hK(NY4d7ltf8FeV^TVQq|fJho08P14d09BZ( z+!c7=dmT#}KH>7R431m6^x_l!m7zf*>I zNkz@iMxzZFi$K(}ynED9x{slLeeGVq3KUp9I&jI8@p~9|6j|?Q_l7+YT1J!NUhHDl z+bqKgjl>tTQUz49a0-d*`$9&J`Dn!MYT{eE;jCKZut_>laisZqFF7Y}3NqNi*x%wv zA5Dz&0sRH+AswZjHvjLXY-u?4H+4W-q5}dlCT=L(<9*?+>#rdETK$XuDn=T$1zUd2PL;?%=n0slF3@VWrU-7nKlFMj zSwsmU5#I%DdV2FB=o5hH#l&AL-`cznp84ROdwGAbN@MiKAL25-F+P8xT6y@=^MOem z_BNly=*NiMHE5P*NLIh8~W@!I^aO4Sad6)J|#dn9Kwzj-^Wl4XZdLT$VU7CK(vM12~@R?_a{+V ztJB0CDc%z6#PQTLbZ@2H0NCEWU*IX<`yA0%%LXqG!iU_C3QV+mp`LioDs2Bc-{P;##0ubp)Nq1?5 z^78YJ9%r(7L;o8K*uyIG6r4TaLmGiUph@0Ve*E?lxn%ZH5m6k-{vnXV#Lruse`-Mn zkZ{LmAg!sFy{lqI_VB@(s%q>A0tn05MbEz#vWS`1lJE@yn3YFyO)bByhn7jBax`41 zCu>QaVT&bCTmXr|9NrbVdem-}^(^eVDAaFJiXcGTSTu8HTsowKGIEBl=o1@_dt(?n885fG28v5%+#*=K_C0pMyCookhB1=8GWXH%cRzYcxCoE{yDu0b z+Mv}X=AhPjLPJLYxs`P-GejkVhER1Y41xI~Xu-%nYZd3x0DluRZG`g%g-6Kr6>E>{ zk1{p=FRWp7ANk@x9>5TzWhYbc&{g94EPqq;sNjKbB6=?(n8Ut{J6OXgVR!npN0B=2 zmT1*@+(IR;gBq)ca)lDcqiBDW_P_RCU+v!Y`6_%y_yvnfUWU)>zgbwGAk0F5qC~_z z(J~C)gY~6*_GCZ_zT_f7u6a*)ahlPA1CUR{J(}$nG)|!ZJLUK+P5O#fJyGH!v&- z+rBNlDXHNew@NN`7W&B-Zy0ue=H!txXhg*YI9ZpjCf43{sGiv{Z$9*qA!IMxH53;x zR*RdFqZT^+uF21TeX%*-FehLLqX|Gq{)Br71+*m?(iyzxCj>~x1~EZ_fSrx46_#^y0)}g!S*WX&Qhc#{it5QAWa5*=@om&B(sLhZJwFk=9Yk7> z`$X;6?}9m2*NZSQb1DUHLV$P>05ICfn2`X7;*G1&k=&-K{t>wV1;i`3n-*h$cuhc7 zhAGE>J}+DO(*MhHvXdVMZ#J{ z;`<8$cnkR#K>xl@ri6QVdB|n@Z^+QRZ(vlX0y4BvNu@3DM9MLsLlcN>ELgToc@3tk zhI^syF^S{b-@Ziq>PuLlo@Uy_p^}7iE1F572s47bkiE$o3Mspf68$ME;HJq8;QTY` zG^oM|`wY}SUTRGkm1i)FOl@hGYNIhH}&48Zvn4& zF`$8G0RWoadhZYN~)^O;91*OFg3#}GcL z%atHe1jK^_U8Kf(^$6tfc<`gs36Iu;P61q-V&EM8e%IhVQwrbTFnfl52Kh%c19If4F@J(kmW~pk zqjR2$NzF51YvX~HhTI6i<~OPn!xbyq1$8r7KO)|$&QI+52{6|gsImQLzg%RWyO%}Q zo35KAe!U9Xt#_{dC;V<^Zm+hs9;n}4DoFmhl2_$(=TvY5*qjbBlJYO{lt)xXxU&(u z+8+Tqxv{o9@)~s->%{6oGL{w*YrYJRw;L315Wre;Fl3Y?e{UknqSV_NG*ieB)Z9Ux zWb_+=+kVoYEO%dPj%V;_$bFw$pT5ltH~>T0M`A>x)`5=uT^bfmJ`fLKAkm5P;)3+w zyc-Qvbp}2Ae@`E=qvBx?GCGR^s%uQ%+|zv)_^adbsM-|${)rQ*$J1Q_WY-;<+X?sqZX#3x z2g*RnVZ(at7Q*RdK7nvQ5KgGwX*9Z%Iz^UEn7ym&PC!))8(obejLe zi`?dh_EeVmKeHc%{?1RpuhV1B#ou!&N4H(Z#d?j*?olZFH7Cqj!ISZQT%1!O}XFuCJ5**`buUQdt+ zu0oiQgo}R>N5CRPgfPu>$opS&K-7;f}4}H$%tsleb$?CW8nw8T< zg6{COK#TofKOhc_cq|V&;5QxL-pK? zC#W}wKFqYHE}OW4G%ikdo;yP2hm>v+CC-2ctJsKIb-0XK4PV>UI!6x9AbzfWGf^JU z5HyqRdYABqI_fXFGwc|OEF?v?Xmx>jJX;uogmz(5P}@oQax4?ERkEqCguWv>9+ zIxMzBsC_gnp@Qy^863SLua%QmqqI`hpUd+HlmVjW_6lH?JwH)E7Rh>00jp* zN;jJsBV6k_BYJN<%6Pn{j5 z2>5=sC#``HT`+IRzNEEa?mW7~SmM~Jt<}x|zy>Y7kT4h|+!xgx2vykgvFS6onJ?xU5N9iSea+U%V&Z8TB5JLXhN;K*;uV@x|aceLNyMM>5UgXSKg zI)iDS?mrvELvBxby-#G^u|0I2(o+2v@2;JhJ=%FXO8Wf8EFS#Joexd*>TF0_PtU~D zNcY?Et#aC<`*@&9TiYfW`;1Yic^=(gRQSz3*e+{p59@2BmKBN{ZTD&ba zKK!B+#kIO(LD~4E&H-AZIp1Rd5tn16F~H5%_uAMxnD*u8cpJ?5ZH7jQ(}Vu__m{Ip zQJ-sYWou8<^wRNlNk9*5D4y~8J2a4O{*I@Vih4*25}HW{W3+R(HJR#j4>($Fv^{IK#?4>MX=^5zOHpKaFvUyipr4g(@ogVyzUFzL zn~W*<14IZ?Q;|_&baag;SxS~YT%JZAVUs$yx0s7Nm$fh^zmd&!iOOoHPfJ*+r zwe$Ld62T+O$}=w^yx?PxclO$Ceavn#`N?#e`>QN}o((a2f+D2XDC8MVHCYLe65m^T z*n7{(KM9_$eun({**;oHWk~oAS~{d@5hw4t!^DFQQ{T;((;y@2Kk(MrDOG) z%YR#`<-XP()cu!hP@!;IzCB~>(3xbywY!VN9|{;^fsv9RN5V8VBE(Q^=35@r;3Yp;We->rPRA`psjz0pKC?51cPVBXbH8PVFhT6`igfq?tD!)K5FI51*d zax=)hriyt9V3R>mo_Ox9o})oW)uY}3-=tUQr6js&0jp5+=G^x;-m|hB#mOGbt@tyJ z0*vnG=`e$%w&Uvut()ydkB}s1@yB^p#Xla~6TWsSVa<3~M<4Vy>6AiwhJrsw+H?|L ziX?eZg#OcYw{pbqzMi8_Kr&gfJ>^&Hs3(?Xk61HUTY+j^a@>{_7geG=?AD>GhFuOb zrz%TyxA-(}m!XFE9Q7aN(kK>ORpDI#Xq$fQvf#bViA_cG zKG_={HZvX>r=uNZPYDxSzE9RBvD={Q7bxyNOeq!0Z+w=QdJ9_dcc!(1Ny~I$9HHiO z{rxMvvkv1$53LRDlCvf9jvjxT^K3xM=B)S9sH@0ZiYAWmaMV4VeLXkqV7l^rjJYKH zwy7(hG*S##WzP-OaJvkuCwK1Dm^XHhE+6;GSx&CWm24EXuTbrf5|%59kWc(6W4Bj! z%hKJ$P&~LWqqKG*yK>mlq_Lagh`vz}iGuYPf+#oY;jfGhaMfx(D&b3bH+jE!j@)Ku zyTi4ihm~ZGM^seH^EAJF#*1YNuYBwITs2TqgpKp?`oj-s2F3z27(BKWoUE_y$qsur z&)+6hwtU6uZUd=t@J)dYK$EUK{(3a&U4k$JD=gTAzP|;$XtpQFR}!=Bt>-#k3W08BL|PGJkB- zu28NklRIWPX^o*fWSCXLU>b#A?+ts^?(4>PXWRVZPY?RXv0-0Q=DDM1M2>0wD6qIT zlTXZoxVCL_5#=W&Yt-fW-ZZ%%4$>;3gHT!PwIQ<<8N5=Z9m{!ME$`@c7@hd1%E)<) z+n8BNghi^AuZIY~)<5Z;$4Z<3`}+FExKG83cvBsNfym2gF6KuVh&!`Y$V(FX4xAfD z!1Yuv>W^0S8jvJ*0dxxFZ-5mQhL`&ikv@EvZR+WE*Gx35z2Ojaer*= zDXp9!^Wl4%j}`p2@{rxHFmWT+_Wm+baDhl5;ylloSUaM)y9 z&E*L^v;oM^k5vAOFdPLR~s<(Cm+_ zYB!-$Q##Ff)Rk3K9_=0}tNS*~6UUgAm7i2EwW0Nm#|W6$DF{9aQpRuctO-8iVGDE| zDx|?Bj?;dPicfAWJbSUAo8EH>IF_4gG`seL$i+JxMiMiPK~J>lRWOAQp-T1F?K1ZG z-cp@f)0o8USrv(D5CuH}1(n;LCsR_q-J>r~uNFE7nC>DpnezV9F^50d-aSllL`6D> zOOY+wddAyG zuZ9Q&bMj4o^&Tx65}d7q!zZ<`+1*V!^iB6K(a(6a@}EEdt?x11L|+!}YRt%JJ7odm zc?3u&gO4Ya=wiS-TeO}konDgC-#(*8W_n8IjZ98ThAs2Ox1}d1ZF2iR&mC8mk#^#z zZ*Cbsa$&Q3i3&=QI@Zr3Xu%H&{?y-3>$AnVJ3hEys@MxdFY15r*t?nOC&i&tWQ_a; z#>i*Qbl3`8z~4|S=0CTsymgAww9p{i!GWelWB`ljJfF*!?9k;~+Nd7u=)80mXRXK0Eg z+#@dZ=be>N4R;KY)x9Vdb{oJdS8dw3D?t6C=)byKk!icGx7q1BYB42}yGU&>RFW(p z)ya*9abwcZZ?x9ktGT9)ysFEV)5<;iLThfJA-^8fNnyEAU!bZ2>_<*7cWB360>AP; zHxsiu7G90=C&o@Q8wh5zVn0X_jSgAEoiJKAg6?p5>+c6Jsy@T{i~(=xYcT3gG{+_u z+gmw%1k5X#~^I!!;W-~qs5B{ZN?XFiYzzE4G4fP*258Q+=%i4Oa*gW+b#T9b-^D75>Mg8_3^SRqysOPe=^@24RX}Giu-Z|%>>+dYw01;{ zf;#}S>OJ(Eho|d(evH=ThG{ruK)d#Enf{x$=*9}s?-6!Riix0!_KEF|&6q$CUZb!Y z6|^IK^Q4~gT(A38`9$BS6ZMzY41hX7iyY-x7!%!R0+WzkCtbKB=$&#M%OF!)d z-8cK|tF&Cg0=&Z;JM3>Q4|(_M+nmq!tg)m$*RVX67q;|ji}ph7o= zlh6;Ue8ME=e2;R{rfa>LicGmiULG1D*Z-Poy@}OpR5ux!I{3>@T5RLqBgoeBHr$Vr ze&qI?FUWE8sgcdg&BI3W4Tzu7iKWRtA^ioATfYpx1`N@b znxAlUXzFoG5bUN6^IP?QAEYqRrW{2#T`*N{E0Ff9b3TX8HGEFij!NJuhnK5cplZvC z@#6?_Vh_)z`N;v3uhuOuB%1CS*DNOgQ|e-LO@IfrI z5&!5GyHH)+COIKw2iBk#$xQd}?;iMXFB2FPjh8@M2(KsHqZ<$bvEzC|iu6YG9>P7& z^BVYlV)7Ga^HOmr$oUt-4Nnvxh@XB?ytxA7wfQOlJRLgvr5<3lQl8_d`M$u0!MF)D z+521HC1C$I03%1qEu9WIaGjRe@>3BO?-?1%Kdv3cvf$gWPDuVk0h{d|K>r2F_W`N~on6R8Q0^b>yq5KXcWoP8$Wck?x-K3A! zr<6v`u2-lyd|v{v0}pbX>dS?q$Anpm!0;f>K&B`$E~4kPI)|A)`x8gtkD3Tgz@NVY zi1VKh!9=(SzCrYG1zI>T-)5DmRalIO`I|)+RT3(LJ{2IXL$_(k5kxNL#FYV#4oOCl za(wBMk5=l@%yInSA&3yllTWj=gJD+rij}AY(+diVI}jQt=*%Y%cNz4^qZ7xPH)p&I z3`aTUIo={B#$zDiE;ks$;>yULAY>XhF)#&wq{ zC83dV!z*4{b9KjTHt*T@&LEO8z~>#v>NSE-7u7$4$;1J8`QY%L0+GWfKeqndYddiu zZLZ@%b85c$KOGptXpRBs6PUdF*bz|zcLXyW_V0PE!+9M96W#;o7N%|yEqqWX0Vex9 zLkWRaW{Mc_iIsei(a1x+s64UIgD&$ghVcyp8`1iOGFlPM$_&jUmIgn?zD78~Bq4zo z4qSy*iO^ic*8=y1iia3k$M^uEYJfuL(UA~BYG*0_liLr)Rd~XtRBo~rVF*nVh~rJL z;18&IHab!zrvPY^=@yc>K?;sXsLl~u7}o3|c1}d229koSatiTVkj~6l(TRZFt#R9{ z8JA!OUnC)v;ZhfB{z14u+{PX9tX$wR!BLmq^_eI*aFL0*K*U^&2oL^)YE7k3h}Xxb z6Rw7ewKLn3Oah<1+L1x<8@*UF7AZYAjb4Qb%5BWZg-~SK4fdVK2hgn3oiQcikl86l z=;Qu3Ft><)h4=CE9^$IVJp|nkRHSd90Bn zT=jZ4i*k_>j($&8lBiV;#P!|bZJ+J8ZmxL8K%C2s0@4W@Ek(qk(Fb@AzajbD&yMwi zzc7A~57^O|)P!+ksh1BFL+Ts`rM68VeT#5~ zVJn^#<`PVU(&2FC2gQhTim?C20)|b3hen_%{0FREZzyhF3C1eGcz7J4j%m7w zoEt*f1H+=1bp|Lj<&(SFfzX3g4SR5Dplm|@(7l9L36O(J7J<7Z8Uv7rx{Rme=3rH? z$SJ!zpmtVnhE0eAr8N+5P_JtIN~k7q?azND?*4014#@ip&UF``O_P40`0Bx0AJE==7bs3 zn6Z+AhXG(&$N69J?ZbVZEw6Z3bJ#>&F(u2mY|^Wh*`oIokpV+Z#a9uQH1n4c6Qc}_oz4y7f-y}203jof z9OQ1z;BOiurm!U)%8V`aIeLB^lK*n=9_AsH53$T+z#-%u+8K8{JRv_>0w$HnSF16X z4yDKHkA28JeZ50=DuP)myt_kYjEdeH>^&xL&b>&0)F4{rDf!M8v~+}1_}kz!q4GhT zLgXuAvdEy=-T5INCkf) z{4vq=D6qO!Y%@>zR9#GMzKnvpj1=0OW<%8ur_kkrG7Z|*RC7ZAA%cn04p3y{f%>Cv zdr5KPXU~pevA`_4^P=U#st)#KABq)8sAaz1gr~l2nw*A@m_@=A%5-N9GQ<3CpLUnj z=O6^JKaKYqGQLspD90;3ClsnnYMW#jSQ1$g6XW%S$wc3hc8dH)0yj zdLDOk$Pb$XNz=={<`El(JPOB4~t(Ah62Jyf?Hw$N%}NL zmRJMXc>Z>h-TP!Qw0aS^HSwu2tCB{S+yQzB+g~MBlWEZkYhkSQEBdpZr~J0WYy_xy z0%InS2r@A>0nGm$IznX4-xnLqFL&UjX9;zvy76)j} z+xD5He}9Rq_T}2Q!)dpik`+irC}OMyUJ$Px0g-ES!sT4r-TSB6`MP={EZ(*_g+}b* zS-O!_e_Jf5rTJONvbe9*@!p=V6@HaGuZ!{q$~%q~A@wZoep9bto4L5JWUpPsa~PM) zmVj2WG*h!Q?VcR!mc7cvg591k5b=99Esk)mKIqK29e9yOd5!Rd7V*#)c|E_<(S5pw z7_td(wJP6KoL<6}V@KRR`@!7o2Y5qfR_1Db+xW0HlG{5t&f=n4Xb*^z2Q_N$F8HX! zkQEfqZWca@6goC~f|2WS@2Q|--9vGeR+gA$Iwz`2FbZ~(^_&4`kDNDf&UfHkwRUs`Is04sIm0GT z8RRgl?@tUneU6JOMCG7{eK%p%JzMI1A)86jt4Suo?kvrP2R1F>XWk7n#&eFp;7?RJ z%anF2j_);K4P2g%lU{r`e;-onr0roJ@Z#A8@w^k>(u?FJ*dy7{-~TWaW39 z=_jEt{`oG0N_{W&H`P0d7PL=%6V{~8Cowk5IXoL4rwJHI`rsgyLZZ^qt8@G?mE9f` z)^Gjd7jEv)k$b1f&V4Pm4kW&w58K1ka=qXF34%EWo#O{~w;uiyEmsV+r5yMP(5#@h!k1TiQ48}5j-ypSL=4ARqm?Xy?;yO+HY6X$`|(% zP}0sS*x6|O>ls7~o%ENuYU#q#R`pbPz6X(xXeJ`QuA&6Y+H4xk;daTJBAsL!C0!NN zkr{d3pVLysm**;B99G7(mHi-0X_o}8S+8SaW`cxj#~pI=ev;i(EhWA5F3|5=MU)L=+=QTP4~sN0M1RZ!MFcg)Q*hP*A-*3=h%LW*q$t5FIri1r z7Z4T5eo69AQL;%*Ef;>&C~JQF`jNJ7!ieTfIMSeqZ9#j&7TqoqwWV!TBQK&J*LMVy zv1hiz>)y{RZF_^%jZODeJGQ4RoO;7u(HL*2>(F7B&i~7>4magS_tbBsC1Y3&{OIDZ zNfgc@g55QsYtqZfn@n0X9->P43JD9ntz(Cj4e!}0{$G)OwvWx_0@`kli2tN6e{`ml zOI^b6#tiZb4(F za7;SbjwSz58m(mOOF&)jWLd?#qsL~iNvFA@iei@Y5sNOo-$RD7;~it@X+P-1f=4Q- zqa{l$f}YUOsHL*Z$QNJeV7up)?9oW{yCa_D@m)J+BpoH8Y8TV!vb(McC_^sX6%>ZbgUPXygq44Q`?<~oX}d0Uip-d$r~E)_WHlC`d| zjpZDa&A{;ifL#zlU!z1UqndT5%5y&or2tyi>S?dPC@;bs6F#+Q%As+7aEgjs8@=G& zIH`-L^#sI7CDfr6z__pg427GrpfMPQCcLRQ1Ot|hQiOwkg^_yr8tAzifz4H#LDqFWbCPWbx1r^Cb zBqK>SN>GwwASy~wBuG-4sDf?;l%(Vw+@i=PsUQNjAYdQ~NRX_kC{aNq2{tI(+H1`@zwwRn`=n3VIk(x0E^o$_<(m;35-LT}GVWfB z#{x3C$?~F9KP4u$04>%;+o9&Pl?693JKYH}(a4!MH657xGbvZ1df-ICsdsPd@xM{@ z=BjI}tikDRgX^m2uv)#E;oT1)^(ZX6sNyh-VP7)KGWXFhw31MPojG-L6~}H?G(}e> z(sG`Hub!x6#&+Jjv7>QISaGvveLO$i{JiVWvu_Q548rBUIlYmu3w|irH=H3+(Bn`j zO*xD2^@AhMO+;_t*N5BmRqZvQ7M#M$J4%l${*jTUo$!4ntvtakL3}QuZ|NCB_~+wh zrHzNaZ=cKDS9i8;XMvBf7&j;9<&)xKjjP$xy;?g9L=x>#Er>AfySFyr3t$HQzhqs0 zdUrmg?cViKO5Ej0?15VQ^pTE6B~!n*f$FY5n$8?-5j%!xs>}9RdK`8(<0XIAJvqpS z{401f{}4#?AN+wF6R~5tT+m(4RYBqq)H$;TNf_G+YeOt_ricH7|A6R5{|^kDzw{>* z+9HgdCoj>bh#6xhc{|vb2FTH47(*F%S=pSAK=t3Q)7;!EJ zCnub+B)*JgQ~TattoFnx2$+n#W7`)1E=U%#a2U;dsaq_)+;40Uo{c$X~=+?5Y^bdyAU8MggzIwV22~y zdz|7tk&C#BvZ(NQE00%y6ii{34}~os$h6;8nUt$E``eyb7-)(bkCdw@S)@NQdA!Fu zWs27!Yv#+uYdcAkmJ1B?zlf&5A!pl$Acr^K!{O+IQXHt9(U2x_Y{W3m;Izps{S87O zl38#{6Kg(y5Lfv)ay&Z*A+;zelqYh1Ci)Prsh3|SkT_fs(>RG&+SttL9OObw50NoF z2Z-l8%$DGpLn{hhq;-~;ieo^~U|c>KBK0H-f?{Vx>ln628S68 z)?Ux}J372D^Ww&wR7sBYK7!NU9X%L+jbz;mfArm1w$B}oCxAz_;M-%j$GkZNilMNjYpx4m<0!hAu1nu!0np700oSURm+xk%C8lkaJjyt z?fTHDQOz)9O*|gu}z zm3?(PVvMY;)OQU;6>fFmw?%A?JT@1Tf?t;q8Eu6(s!y^v!Z&4PhOysAva%VC43RK+ zH8c+8Vhm#G8Y+H2sUPvzUj2`FzKLROtL`9miO{j64Z`Ya^BXdsBS1QhHYAB54PB7l zn3z2f{g@1%gt*}E2d$(S8`W{eYJxv%J#W5#1SM;DoHP z7kaz}n`$LbL2dockMBM8C|_=01zz*zuxqlN#kacI3^E2M|01kde`4qJzyk~&Q_D2L zK`sJsRERL?iWiGTmA!^4D)lto3nhFHi%@+jqDd1JMCNSV&WpIpl*m4dzmrX5d*l>c z=eP0f4{;3$_%H?S0Rs3aKv~R+*IP^1^yI`@Pvb@qKwkbj&I3P5l4LG+6N%AM>g}8G zQv>{{%gJezM9g2VT50#g)K!-xc6ww!voVJ`N02Pz?|2l)JzE58dWAmlum(H;&}(L;Iw8rRp64YUr^I^L<5< zNxTU`6xS?Iy9a7^mH4)r7zwJ1);8gi{1qR_k`}=KGUF%QTsE(Kf;U(J zW#v2cBuLZzVnxqV7IdYnEq3J(3C5(kbr^^$Lj#w8>ZsAre1UtTMUte9?B_eR&Qmi5 zK`|3GYtTv{k*_4l@BB)d*^Q&b>Gd#qas-u#9>oST54@5R8$@eeeh#GC(fn4pc2!%n zHUy2zT3$0}d&+Q#aRHKh>pnhJ*C9v9U^dr8rX{Z}ee4u-+mkajQg`?3R}s#95d+lL z+Z?s~E0wxAm`+JV{XtuwV#3wQR-?6Md*phHYegL2`%j45C@*FlRxY% zq-TlXgFNzVP8*`+ZC%tTpfG_vQb< zeXh*_GXC~ucGQG2LDgT5uciyGpe?eD}CVAKHab7%3Ny zZ&Ov>!lT>%1}avg5Z1`;waVf5&E+k}+#9~&zC44?zG8EyQay#SD6s0`i}oe)(cbL7 zNfIYZ6C)&h<$aXyY&rh>SrhGyX8YsXpYoU9K9>1)eRZZ&uYcUI>xBD)ONUnuS zb6{J1ipUD_pDzu>gd1+|PUsqQ`@ARkjc=_a!x?3^|HHqkgO)0^ZZ zf+?)*l@7YbshZVP^}2b~XuZdVoQ$G-huO1L#g_j3LJ!gJ&3K-2Vu{pv#*5vIW6H{& z&>wVuo0@z!JII+LWnMH+n1(llzNKd!+;k_$P3q>%1Wq%oXFU(q-(KDDZnOBuC+E(@ zD?nHcG)l@`zBy-}=>%6rsn*8$qEG4p%7u=xchmC25X@Q@@wwr~OM?Tan59`QIBu=v zI%{s2>QT>AtK`!i3F=D~#o+F5wU)K*9J!hD4lVxW4wN^ZC4*LntNlx7zgsqA@0WV9 z{xe)IzY6pnqe&kUaej^A!SPd>n%Vc1xq1wSZG*lUZ3*g&Y~l`A`CaA!caV_T&hyxs z=~inwRqyt0b886BEUjZLZ>iX$da>NAp}D2((gmrBLn+Eh;w!jrQE4)?t6_fT_sY=W zYw5fd-;*XL5u%WJ&HkinIVIlS-D+oFULac}v-}ayA)Jty6+gQ_y0S-iASvP*w$3Px zUEcGp6Sc1fHM8&Y3?!)7@#O8M=q=9lt@}OLNcepR|DSqWho*UEX5yaBF?ttrZ#u&n zI&~^b6;Tgyx`lt~*73auYtzwFIpXkTi|dlzmqon`(GA*3{V2;_#hdH0vAE)}2aFEM zCkt#3?^>yR`dU=sMG_kDh^@WE`-gWS*1yhmGax4#BtGRf=7;te4_uc zppnE(V-;#2aj0-A(;OH{$g($JWr@gs5zecoI`^8bV(9hDB-(Wo&pon2rmrv9ZB##; z=)OacAt>|JyjQ==JGt$u++PT`ql51a0ieT`dcK*pX|2+1q*+Z1ZHz6RC~@5avf3hb zH>zO?@#N(j4q~Y1+&||u9BKPq^5*NRAJr>{_2sQM*s_oAT9s%ylltJ%){?-bd^f7Y z2ODCZe8lQpanOG*5|oF>FO=GlBCjdgrB~7JC-O*;Qs^1e#Nn&>?yQ_?#2Jkq=IVaE z?%bqReFa9nf=&p-Ds_f=MQ>R}s}B-stYTu674kMg{$lmI;43{M1NL^$DizIL)E{b8 zScivE8VxL^>ZEh4zJLCdI>NQ-#kLK)G^}NmQcaKgg*yvKuo6=A!{lVK?VZs5(%RZ( z)(+va3T^8<^|>mP2}P#D{{EhyPH$%Ol2&w6TTVA6wT9IepRX<^;PAncT>c>o8)U61 z#6$Qf!$t0B9*)f$d}lTF7WeBu%PPh0-F!InmwJTXtKrmFDJokd3Yhn%GVRd~w$r_q z__epk^?atL>9#MHLAhf5ay0jq$c;d|7}tEw9e{@=#6SrGyeOMoa(kBRzAr^S_5Iz4sY|f9o`!kYJ8YC_4y6$ ziy;$~goQ2=AB!<7O-W~EdR-f_n{B~>MX47z4$}vlkWz`yFObvx0llS0Ri7*{8 z<|UMQ&rhyTOKd7!u6VpRHmCB-$=#Y#qDzZ#CvZ~WKOM;SlHEFBbRfIOc7(6{!-Njo zf{Y>8haeVCZ3Tty>z?HTmv_;5btiC@=Y@rd5rg({ySv=2y!@|5NMK03?18T`ADZ_bmYxjGXK;WG{A4&HKK=Qfo zwOx9FEE0|5vE}7(Sg1$%KVAALph#kqk49+nHynHBY6K(vnMohQXfA}$vT$an7EjQV z-`4+p5ZnAk=C#t=KeP@mu4&=+0dZDCH^eY#0$l|+=+GN{m8^z*32p`mAlofTCnX-S zHHH8HptPnKhvka0@F5DF1VMEDNkhVO4lBEC3{*T7>q2zw;=097r-$~Ws>dy~cc2x& zi+VKi8H^aqZ;rS)1?Ng;3h~o+eQOY1LszBAF$D2$s+&=FW*j^ZtOaRZPK{MWx|p4t z`#|`Ux7?)q^c7ene>bOfJ;)eAS{(suopsLxKFVix1onhh|I(XdsfD$pvTxkh@Y9d= zeZ4Y>4IkW+M$WpIF!&vNktM}0AcOg>lD{|2q1 zY}Dq{RLR!@*DRMEAJG#Or!Mg*UbJ>bbs^sjIrOIUa@}p$%g|e7Qj~V_6Q-Vu+Fq<( z|HIIJz`?w+p;JF#ahXX^2xZA;346P6vs^ySY>O|)M};asY&N9WIeZU|E}{F}RJ*b* z$7JSq`l1Sg@~0OyM(5Enn4S6Dwe#i}!o|KJy^ypb76%wlcm=ll3>46s219>s80rcP z??e&%3@BQE-DN84?yj7Au6{JBbgv>IN+_qNQJb|kS1Is1C}8Y^xVMSp)mxd7J8G>_ zP4x27Ke@wcN}9`LiiqhW9H&XCT^Ts_v8rJR@J@%WLQx0*wB)YMr|+TUQ7BniFIwRc z$1`h%?(bQUXRp1*eJw$;^TjU6M*%T@X#@APjLIRM+COqjMy-CQUFbjR=({`-4i+8^ zZ&T_NlgM&$Opj@pOL7k$m`lH+xx4bHYDbc>K)calu{!7Byq-2sheO?)AWhLGE_LDw zI4+;l@N13xr{Oo~Ut-!w|Gb}-C(ut0+qyF*C2#(8hm?R0^}h8m(KMrx$x|*DgR+Z9 zo?Ff`b;2j)#KDJx6f11yi|aP)Gc8UmI%iIk(ShB$Z(HyxM0;+kduA}a=-Dhgl8k10 zLBjVB6^F7e!Ik;|vjw_n+I?5nI@P%8&L8JT6ucw zT7z80Dm72tNgs5Wc`uE~Y>mICKCvy6%5wA+cTrtyo~4Fvx2ww{$KSPpa+$=RN?IR4 z_`QCHBeedP;gR*3>n;V!q_s_-Y1}JiibS{&I714|A1x_ceV&Qr6#UwXwdlqTN=t zO+&>md=efNuDh#S9Mxk56xVLq!RO8A-HZAnIxXR9e6k~CQ235ET#gI6to%ZH-gfA$ z=6&Fsuco-pJ+L2oA*cAWa$?c-nn8QLNzUm>C^b{itEuWXWvKeGf^JH8w4z(xnMTcZ z$fG}&pItNC$Lqj8+UV{TA{k-genU0&ZLO2@9lD|4!>5I6{Yyf;HU>Wn5Z)0vMR5}EBLV8vRW zl|&3}{z2f__|G-n*y1pbqo?qlNOrH}6G0Xs`iIk9?aQY8Mg*7Iz1gcN5ze(UhHVN; z3yFG!?E^sW9hlTLr}y;=hbZ}PXX)2$E#(>6|yy!~XTtPNU zYSD3mygLEfp?QzM8u!tlkClxN}I!jF?ijOLNmY6roT04(>ptNW?R>wCM zz+2UDjCO6zs$oyA;5{3**TFI?MqM&A4hc6Ug%w1txp(v)GI%2bm+gvnh@J9D@8?9o z|Eg9&3V~-2ag52q|0cqz`=sxL0QIJV*p(5*bdhP}3foO&H{%8ro8PR_Ce31p%gr!_Q1xZQipyyo+&>SMoP(tDE6Xx2Z|GoVGYmcMn|p z;XPE)hfo72d?d`IqV48h?Gbk_<}bim zdJj<>+p{&cYyts;%vIS(?E|Z|8iqs+A6Gv@1$WT|W24cqHJj2&#`g}VAg}|H7Y?;t z>dZYs)_AyBGuM5DSVx?HP$M%Rcwqx2zA1t=i0)WLHgwdOb@7s~u8qV0ngT);ehZ_5 zqZf|i%Lvo>i79t4wk4RWAE1AIpJS#Ns0;*3vtu5b_>lLVt5!c3cgDjLRj4Zt5Fgw$ z=P~?}q&1XP&|e<|Qa^W66VnzfPLm3xO$)-QLW^_+CY((|71iIkRyqzQJW&5IDv-3M z5SW^WxNNKU6is`yC8#*W-N48K)MIF5j(MsNm(`Es;7TCkpka1o>fItC8hj6I=b-5< zfW+mD8+zy@x}BssKn6#^+>mGo3#b|9>Vn7@U*oTIj9?b63&C%bZAUW!l0d?OSOqEn z`-x-;Gh>A#0Z1r)))*XXNq+_KL+uq+RFymV9ZYjuS>cThlpeAaLh*Cb@P2p=k`@=R2J?!npc*4}!H4lXHzDbv-4R#-J zdOQcswIB(Pt?;pZEnR^dhcW-7$DB#;4+ziT*}R?-*J*jy2qbHDsw22|IG175Z%QZnEh3@C+^ruFi@z0 zi+Fr&ta<98eZIJ|f_MvI>-IX}COmKGIv~UTiFBW!Ubp$dLVUQJ2cWSEyZS^|n2Bv4 z$Q?bix~9?=bteq9v+;K~7bhnWpiLH2VmoXJ$2ao84wZ9=2mIW|`_SoKrp2&&E$+M& z-?DZ4`yXVG9;?yNF5Zh@$k;V+NZ9)WVZceFaA|}6wM3(3`+Y32Fk#^-d53~0Ig@Vh zSOX)TO(D_2=^sVdt)j}z>vG_CF-fdYiAxb`O5H4_Qng`D+X})!&8Z6C@4d zh>JHEi0{~BE_M+GTyf$wOlR6KX|aIg-64Tzivl?ujQQ-DeRS+eJn41C1bzGo;{Nx; zyU%n;w1~ROlrev*gK z)~cqFbUBwJtEWHns9cP^RWbgzQjt?@DA9(KeF^8JV;x?9Ju9i&7Q(qmGj}mC8)zCiOii*M* z-*Q~OWb*`YCIWwK*e%L@0hkWh-%8t{vLlNqdq}iqn|FeegbBc{F6P_C&CC&%vlD*9C>5-a2{_eqjLzCyg%y5`!;D#l5b- zw+#mmV$K*7-ODZdHxs+YaEP&Ji!IhVTk!tBDgGj`umGDIMsU_-D@Y#C%P1MU{0~4a673x8Y7@JMUnhxS<)nnpn+KYsw(= zYCKI?t#|NzgYL5x!iV%w^!@SJt_B^|G$I<9JFt5`+{!%i$X+bPN$kB!2rg^9K zlKoVL9B!-@3Bdoqz2o8^nimQkF=RstA0@hwQQRO^J%A)Y;4ZoOuM0Q*=K^TSC;n^3 zEBteSI!^r#cLs))HiQ@OpF9uZpS$3HU*!MKpp5@+kKez)&3}KJ|9&R_8nEbJdh8(E z@c;SprY}a!?^@4*zt;CVtJIukWnjqTdyapVVA_GdGcR4k!0`ME!?ORmzpReiu(+tt i*Gt7eFp~Xt8AFl>yV+>>89IK2K}SnhGgtl8mH!1la3v}L literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-claude-light.png b/docs/pr-screenshots/pap-2944/skills-claude-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5c97755cc5f66d419358cbf21efd85c3307d40ce GIT binary patch literal 75879 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%0Dm=@MP1!jj+qrem#8Rsb}D7?R>ti4 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 MO(TsbYWAW327bKr_y7O^ literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-codex-dark.png b/docs/pr-screenshots/pap-2944/skills-codex-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dd396b306726bd3dfa59d595580166ed1502b53e GIT binary patch literal 75470 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/rpHUo;gv}bL_xM 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 literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-codex-light.png b/docs/pr-screenshots/pap-2944/skills-codex-light.png new file mode 100644 index 0000000000000000000000000000000000000000..4642da7bbd565c9eef663433af42f4aaaa343123 GIT binary patch literal 75432 zcmd?RbyU@D`#q>2C>SUqASi+Y(%q%fQVJ^FB`qAfjv`2R*FhSTPH6;0;?PQmASvAq za~+@g&di@PYt0|OS>t-wdf)eX;CMdw=f3x~uf6wm`#)EdzK(wf|H6d}*JWiSlrLPs zf&Y0){t6cSm#jrD_Js>KFUU$fdFhL}npz|D5XUSd+}cdy=94g~OBpZ1 z!k)kQhIMsmO{zMxMhO11KIGIhcGzXQtg(UhO$3G13LP04iANYX^%zc;B7Bf12gS5B z|Nd<0l1>ud`u7J93%~Kde@IA7{7zB=^XK8CM;8M9Fn?s8KfiGM-_M1A`gDQ$zaM<^ ztV6iX# z3i6MB9J@X<=4rx_;$%mQF@D~>gzM2vs#n}@QRaQJpL$P_G+b7u6pA)T(i0k&k2l ze2OcRD2Mq4RA~`>y^qKH>r+(-XyDTX5G zzuh*hQUCWIdwk$~Klrt&k=qieQ5Q%-(G z;9I_CrFFHlcERem5103Ln1>GSj;ROu7m)jF+Q)NIR;!zPC2E)0_?koSiIn)Ba%nPO zITtCxJoO0^?5n32U3kLIt=vuyHh<=-j1e5~ENw4krzGh2o1{MV!M%RR=;PJf%>0I} z*9y4=T()MJ3TyjQ#eGe>66$sbHM`rlX4_T%TdIcbZXv6&igM(1j~pSr;`p9TBA*TK zAB&-a)8)d3gz3&$HhQ_3m7S%5`RNvaB8y+2jeDvT5_xUv53^ic)+g(_Wad)@5cBXE z9JO|H9o~3E5oq#zLXMWfcX;v|ize(z%Kp79sw4VLn$&k!NEwtLE>rp4W*LRuAs5S< z%w^g=-R!&2lX5=cG_}iP3$GY?yvm1rn@wlD#JH33)#qU)hm~Otr?v4iU+%FC*+}_# z&iKt+52Psh-+mf%S8I895jzgM89oOM-yI&!gJoy6a>{zBAQ^E@a((7|AdyF@X;1x| zzO*Kvt8D5e8Lqp3zr4<8e39l&LUu>WCH`0CfA5zA^L`)y4!S2&z1#C#;dHB$Es&TY zf?E9JuP>^Xw<6M|Lt6t$dl165QFNKIk*)W(e}DU6({MU?O@%guN=y_xn(>wSug|}V z4Sy(S$Z$CPeJK`Bfjm20fL|nYUM(MTP9>M^g(p@Fyv^cVp<1W|o0<9ok$)nul{wBw z{Ec7=zW+{&sS@l@V(;q|ykT;m#G^P2rOuQqc6F8N5etf|qvdQmwO>uT?r>&rGpM*` z@(Njx^W%TtJNOYwrCaCv>)M#uPUf0Mv4LdT`tf>$(rnh&3NqE?M)wq1=~wHCYB*RS zPp!Xs;V|67yt>hHi=W>4@T!JgV=%9(tu*@rGa>$?VB9S(JuG^Tt+k07x+$G1yYK3J zbg>oircHZLVkaBTa5xbQ-K(arUwwIPY%A`2Lm`1X7jXg$K9H@X6s8!*o{A7A!aP4} zJN57JcT(M!Ao5b9_6XaVmST4%m8_sK+FqF$X7%x}wwJGwJ)TaWl* zn(y^%;+y{M`L@!mra+lTS2h$CH)p=fB@31_l%Yi290&8%54Yw@Q|<~ozx|o>Vyw~z zj_tx=zUHyNPn6>qSl`TNB$YcBRpt%F2H(vG^Wr_eFrK&7!8)BEE~Hot=9!6*1T>1B z?x^&oNs_bb)bcmKKff?+H-VM#_dj&sT4A^l=Yj+}&hKy7_@Cd)ue&VS zy)_6_FUU9j4>R4WFKNKW0)$jd;*Vw3E}4}r`fl(e#Ol9)O^Sik2T#4Pgg=n3_dKnp zeP89csuA_*#SZqrg5+Y2K_3Nl9EVMf8X;jtKYT007C-&}ew(ctFGl8(kkcAvre0GK zt?2V(+EY52u*QGI(Io`)t5dtnL%DBZ=kPVU8Q_FoCb*|nZO`y5>e1)Z0L1!wlq4m&i+L76*>yKg&d)x>S4Uim|74s@h>0j^#B801|^1KONn(jp=51 zsj!&2aKfQ%xkGJ$B1=Zas>R>qJGkutSPk&Vd6PjoBj-iB24;oW8lc<>W3M-yi>CU` zM$$;)&jc5?cc+M*|5DYh+Z(lzjil>>Um7hlBcCsiq*roGh4GyWQjti~$$7^uN^pB%hwOs)Xy3GWg)+}EK`z>3D z4rD1<^k>Na2)R2FDlF`>mEj^AP9rHyC2C6PZL-AOgV||^O2D%4JdCQyxlH0DoB%O$ zRkB@^E&sFzw=}TTA9#%xibUvV6{;3a{-8pxT+2cK5I{bU)BgHazfh+xfP{(nP4E5f zm&=3sxkH;Px^P6Hv{tj&j#XHRogF;riD*}6b&xE)PQhVtDb=YhjC!b0m(TE#@D4S8ce#Q& zJeTOTu~-O?vgG4u&;`JyY{tJ9k8vOGt-5V@@vV#0r^ovQZ>`sBw{J|xzk$u7vOE$efS{`h zecvN?K8|@Oc-9zT>G>)1KsqFe)A*SeYu_f2KG=&z^!I%{H@;n_JCzE&ZFP2X*v8bi*4MYwBc-MUl>Cp$9;~6nko5rkG0Tq6nEQrA;y>QF>$*D1gL|ctxL_6P z7d|S*V~;#japnj%6@vq>`Oh}bJ=g*UnK{~#f3K3VY8B}{F(0+w_epa_U#d+SxCjS` zx`6&!RGS4C-~=B~ktVTa$s26IOWtGQptZl|7@lu56Tm?=_zEu`mZ(g3cg&_C{);=) ztIttTT$joD?H6w*M!mm;N60_Gwl&`+XO%Q?{Tgh>0oC`Xu&v7?%k{njQHMHv`X^M3 z4DhS6>e77)BTJp85Iu$!y1}UHYYra%i@>KV3k}zY3aJK2Su~=Sy5a!KOTyy`XlH`p zkaordM{hY)mI5juWZnk#{p6c+kEE>+;$tBKs(v5CMmnzGnf%VLoTTZ$$>WcJb*=wF z;*t(r3&lnKtP3TQNE#vE77S3ZRnE`Jt{?HKjXl$Z=-ruk$so?XQmQ1HU}| z`=tTUM1&~o0A%x8|v7?(2oH+%O(Kv3ih`DFkFPoZu&(Fn- zu6X+3lhDv7`j(n>9l;CDhI3kVg^>TS10^Pla!6HF6i8TT7XpX5V#_f{Z*e}LWcE^Xq!X}z7bS3_nx<<}< zGZD~nnU~4&qN$O*wW;*Z-(SnXgYWT}M`0S(E#*FiB8jK*Rda0A!Ixw>@_~rOEN69e zx4el(CgaG{>wJX+Cw6{<0A}dfUub){Wy}@!P?pfmXs#pL|541BwFDlE*9L^m62=kv zg@@0Bx#twbu0w+`mBJcD)J2vSo9u}}OTJ0x=94$^aT38pC$k4Ydv^c+Djl$C^2XD3 znIpOVqm6>kntwrQp1vT_DjI5zdB)-Pg6T&-n@J;wwxl4N$=a&+jVM;Uu$V88%nOIu z8cqlW?2ML2{7Bh!03Xrp(Jr5tqtvk7StwGW*3q2~=Dhd=Telpg1=Udgs4J45fY!rA zCQ{Ag<0=9+5gc3);HLpFN#@yh?9*c(~u;pX9O=8Ehd;oryP@cMbKfyz!(rc1t2bET1#yw5`*KR9Y;cB6j^$KmLnzV z=V&-?3R)S1&jcMrB}G$-EyXe%kAQ_AA6k8$VC*D`&cAT8^=N0Q`GSx2N7Z}{N$V+S zesj@w+FnBL2X8xHWoA6JsOkuvEo=5AAS#QCSX|o^ORGOSvgj|L!{30$_zwTu-@vhb zZ`?JnTKiz-$tq`(9%qK%5Ji(qR!U4)p%snziykbMVBvP%S-kfA#raBUkKatLa;ED- zveP49!ll#NBH*S;#Cq?%+g(Mz?=}Mpa3+SUU|$P6%$-q86}c;4>KQ&J4o?ElB zn2vgOE)`C1!V04n;3E1$IStm<_jtU zt~)sk3?!OZ?mHwMa8Dv~0^6x6!?8M8*^F#yL zNy{EU2~N7Ge>IWo*2N=0lwqgZfL|Pj{LVRYiPLcUh3K=&lbYCvNS|w;Ll3E*Gj}Ai z2W<%pRFm*nUr%giLUT0oTd@{x2hfd#@Sl2tBurA|kz^GH-vgkOCxp+(mPJjh$eClm z{Pg%@PdGFUd^{rbF>n5+wE}@=s5|l>cU+`R;VLdnq!x&G6a7|S7%?V}m@;e1a8awa zH(M~W-VZmxPI&x1-YdoPsQr+5&frYcdE;G?X@nyXO$N^rDLOT;SZ6CP{T|f3|MS)q z9*dZT0}xY6nR5N?ls{ZFsH*BCHl>jYp>#RgF;kT1XVY>z`?A2GlJzw?`wFEgx6GO4 z#egy>V%aj?-x^&m^`xwPY}0am>@`toLv5QqN5qzDXE;{mV}aav27!?){3p2!{XV9(MJy(6Mmw8UaR{Kj%gl;Jaic=L)g z%IPJX_wq5azmePXUE2@ zkJa^z7j*bMS8Xu_DnwFn@j&5RI7L?}&VjUW$H_6!A7M+EKFUowUJ?lfa@x=Dnbcy&=Lth)6Wf#t~uTo0g2I;79E z1z&xBIbW@NXP)N*kuy58;^o~Mhh?c=p32{8Z!A6cEy4<|Cu_~B&N?|{6(n`D+!ZcsQd~n&h34zKj60%iJ1Z~!fko8x3|Cq~;z-0tHICOf*>p4ruZ)&6 zeOJZ`9U|>#C&D1+GPICF$fuU>yT4Sky3ITt6X}(p8QD`S7}FBclqBO4bEYdy_~g0R zOWpZO%~4URedvr&cyP+em+t3xkoOLC(`!e++CIp}C6kF|op_IZxj?%{>IyeSmjVMR z6ZbU=UUZ%(v_B%}NRo1OqIVM=wHYlA%Y)%zJt<;Jws9;cN@p)r4mPGctJDhQ7G?A2 zL&jl89?k@^VO7;9D46!M`Dm3?pDLvabZ!8Fa#d_F{Bfg_V=r^};v};I20n386ZQPP zL*S4lCM;0c)IRCByV9#7HE&z;plA> ze`_Z;t+0E>HxzH;roVu=)~ERcK`zZV79K z)=H<2jklY%29b9o-Hw^V$YQ@fKjqaNc04_DxTE(`z-rn(AQC64BeyQm7w9vmSg@yZ zASqkHoWXfU{2iWbUi4BB)YRego1N|BAG+*TRk-w~X5&{)vUPcvP7b&0Soc>(O1qJ^ zwV;3<8~7qUDG(Sm{U_ww51-Gqm9oF7I?D|uzfYlCW#>aP+4vq?fs?w-s0Vclhx?)7 z&25=l;(fGa_H1kR*XEnF#wu5WK{PJ?v_GIE7H`0L*tH#^E(P7Ug4vMWL_>hP0 z2dFzggU8A(q~~WDp4Kqf4hWl9#4KB@$sYpsXGf&v<~sifAPFS4s_@U1R~C2}NtD50 ztAa=0S9N;73R*!+%FgH$crf>k-`_wh*aw2F7-6?c@3vXfI)$De z`Vf_p3e?TH*ZpVEVdOd>=)43l2Lev!{L?ofX~6Pa>N{5M@2pRyL9YWwHS zd3z+iYM$DY&8e~}6=;8;W}o#*Q@uEym(hEMF!BDQ^3RpfVbzy+dM$B=w`C4}9m6+{ zTAQi*+4e{`Me&P+KTkam=Sa6g=c-FNeAIQFsA;$&FLV*;vJ8pIr`TvR8eNT7x zLW0NNZwG{1qJ>hU6*xkiH@QsEz(8DdrY)a0&~6+Yz5Si5BzoB5>AcvRs+{>Oz6L4q zLY9tTOza_@P~G|2vGu^sjP^$8`b)LKIrW>oW0vh~D?%6g%|IAO%%dfyuyF977iVm> z53=W?oOvyW**hK5*?P_khyyCDCpvVvRPEhptRff@vu*lSXPbq&M>ojW8}o#$D%Mlv zc@l9$$vDznw&#T{N6VJ>r;x~*7QAijb^E3M;`^1pF<)FyUHM#*S%XzrOSWcHKwNZvVp4(Vg#G>j<;B7pou}pS1G>mH>C9NtH zlLhx!(m~bN0$K(XLdYgvawKe4>5IH&I$ExL&_X$1r|t+kXa?f3^B8}B|3HwWfJW`h z1kKx7R79L&n;8h;jo4)>98cX4yK4DZqd(`xgPIcau+}M${RvQg<9C){d0)Bp$Rp7a z;IZ2fHCuYI3r`}M5#(=b4j8&)=#d?)3(B&XbglY zk&Nei3I63h*MFcvo*Cgc>(9WOMfIuOn&vLmR`$(8eaA3RLY5InN~ zoIMvjP=VpSVf4e^hA01-eg9wZ@NNzghLetg(8Q+oRqu2`tIpK{3fAD&`N=vrSi)%= zKNZj)ZGlb=ZriO47sEp0aL#?WOz^r;2bNyDaYbCREe6BP0crVO&8k2A7I*|r(<9>4Qs`+>FynEhty(8w! zi7BSKk1T(Is;H4_1=|~BnysU#LZ`GkC)AF}vZ?yVQy0Rvu?=0Py_FFVFt@r(&We$9 z;z|-a+@FC-gxedUmqi1Mmn+ z|J0F<{$10qglO0(kLet(iNt`3gYsPsFsPxl25SRMQy5w=U@D+GeRGErx@Jny-;l&- zqtl%vkWar)ygFXz##h%kq~pfY!m!i{2a5-^PLLbyLZ(WLuU;nXEZ1DK=rHZjIm(oa z<*(o}Y72Yxf<~8!O`|Nwd2^(l563eY!ZJlBBSosN$rO0{tbQqPoVsqy`65_ zd<%@!z7V4pFzv8oz8glznmenG289 zitg9^l0O7BMH^%{5ak`mf&lwUh3ZfDG)w(}jtiw2cdyqU7m%YwJ&rVO>Y};LlzS>% zJm>}YyCdsOPnkQ5#FVgHC~*CLDtuASR}O8+?zNLhN6~V?WR0JumZJZo1+Yatl#Q@o9_(_h#~Qh! zRPDs?z-cvF276Yl<{pcPbCVJ@ueGA?G^uBsPpjOZMkTF32;Z8l0v}N=79<>v0zV;m zK4oM_8&uB z=EDOnH>gNy2x&0Jxb(UI=ckZ{SQ38mG=sk})(Om0mLZ3Rm%?x=q;=imdH(I$Ecd*&iuk!K_$R}_!0A#`Ec%~`nS20F{z|3RJ zBslfcN{wMVs_<8F{A#0T>f0zGu4fT`f1OF5#kal$Rpw=I&edBoZ_J?%uHd6Y zF7_D%i^+RXcj7eZLT@+Q1}Hf%L4YITcv)M%N!)L&qt(^6w%lysm$HX$Jb}v6&4Q`~&!7VKv-U>=hhR@z|B`$V?2D5Q8RW>6}tIAHm zRE8#v%%Y0XTjD{7wTbYqVD*G0O-qT|ccyRx`8*hujcXW zn|sG5^SZrbflEx!iisTRA*!sTPT4C9&ff%I`O;Z&tF!r*bm%=}J<#64hfXzL-3|V;=l?BS zJaTv`i=*~bV09P>wh$#J`GN)dR_70_#P9A+MfP{(zo-d*SwDPYR9LRr%pa~_rKlWw zhbLhB?h4jk2|4+UY3vZe_3fyIF>j6}Wqp5lS&oZ=e{wY-=av{E4WeY!ujaGYrWO{SV|$L*ja!_(kMMA+E#ljJ?k zVgsCHe*)2icQ#YtA}0%v6zPi-evDS-qd`0lJY?xL7P34<#l$w&Rwv?UVMq<#ouDBWas(=yz@M)ySmlH_NH9{L1Y|W zUf3jrN0)(jZ&;EfH$doQ059Dc@W|xj(rlF#(d`yz1Hw#d*LGs$aEARy=a_dA^#0MV za7F;v-rGx@w^~}67@NPVfBnM@3^gbmG={y&nY!KFF<-J;j!KrU5bku3#ARUhIC7dE z)g<+O`XXUt34KLv%gTM;7f^og@L9|E1Qj^G6Y7(~BIkZ{bDR5O5YFMD@dE}gaX-|f zXu;}t5EaNCyJWw916&c)aE~tB>;~`*1e)HqUk5()?vdvB;Ya4WZ^< zS>Eh!DtZFVs~pu3B6Uyd_s0Bc^POTRj9a17MN(_+=F9b(@)spu?UEYJx44$&Bx?FM zk32aWW2R@r$z|#ESKr+8&=TCqqOEr4BAGcmevA+dN7Ej{TOE2&1y3QyFc`DfOuFmpZt9BlqDteFA8Y;jQ{G@1{id=AS}-yWAZFnIEl|dv zNzFZK^Qv3N_GnoB4v%UoB8f}0{ua7l;7?=rP5LKlf>fiZQip=Cn$2jL?n|5H-~G*w z)0xA1SPQA{#DrGz>Sj^4o6IL^QhS$f)_H1SJa~L4x~VBG`;^!~pt9Yb5VWoi8K4db zd4^~>Gx6Mtwc9Fx>Ii2q1db=!WidY%^T#L2E;vlfTyEy$FpbTv>~+dc?Brgr+t&d{ zl|OrJx1UY$(+;C^faJD=werRCJ9a$Dc-8lJR0*pN%o#-#pOHVjU6M0b9TjqeNZT9q zS`5Vp%PW5AqKf_}HECpWJ+bzs>IdlQXjPrmz~3%J3>DNp%3fLS-(2in6_cu*#^{n1 z7Ke+|mp*fTyrekg)y>o_kABui*!e0B|E&tyOM*r1aPmdGJ`bb)@B*`I9=3&F3>(6h zmiqehxsw$IUqJ?hs7^{prWwk)$>*6oEGVFhgNmiF0=iMQk}t_>U;#r^5nHhMDMyHIIPLPT z_(zwD{fVEY#P;9ku|Y(n3Y<;c zD;d-=l@q!Of>Y1+8&CU*S2uSzo7_@@^(q*#GwwS|_*ut#Xu*@Ga8=|E% zRV`gG#!`xmV^xGlU#j?JH@b`mqF!yn7taKvjD~Yn=oiS2e?Gh%H`eq0+l@KI$I6d~ z94upDMEKr12#<@BGLGaw5*eP11ul+Pm7a##RaX6+1MZzQb4oc`x>u5fbtqh{^?pEp zTY}0W#=>bsr-(rA+=lX)2z#kN^N;f%iY~iM`^smYl%(C=aU=H-(?lPQH^U0?M447P zMUqO(t9Z~!&wrCCrij+f34U)hGwyuVbbYq8bJ_P}VI|%wbhZQzhTUt>k9MI)w*Nep zK#5_3T;fPS6zeIjBICgMhC_aCfJ{BS0& z&YNzlQi;E0StZrEdv#RR2tTEG8t`+ikOP@+Zpq-+cuI<1U3<>czakr2#Sf)GS~Can>}- z)y}N3{rJfyHTM)tyBJG}IkU;z$*R9wA}WVmC;V|m%qrx;mCA3t3CM4syOdF~+4cRZ zB8NfCr{o<>?I9&YQ^;~RCtFI{d`07#jnhhtJAcm{ zC71cnM_i2;Z9cmwGJ7eJEx5gRWg}?=5?!Q|MRob!bs@&z`ABQEKgD6ZI}w6_E`iQcScCccixey~wvBp_ym zmR5h4qOBvw?OvyF;5F}@UW9fbT8Q4J*($_H&pb)GeC6R_TkW1^@>h zH-ofuSLN|`n4(UBR@LIO2&JS`)xub2yQ~I~yFee$Cis@?fhFJ|R>`omR^($QmMn~* zN~RwrKI=1XUwc~THLy3UuM5c3(qhw}P{*Kln<9So&$4fgqUCLsHzm3j5t{cCJBJj@ zw4(8Ko@Ni6MJFKhh)t>DNN@@u_MklM^u<#?MKoC%_rcNt!obVJNX(duu)gBeec#H$ zeJmT=y$1>yg;=B?(Nj|8oVq>Jesi6JsBMx%RdASq+~f&$LHM@1+wf3G#i3vrbHfRx zn38?$-N|Q`Qj@#0kGczAw3T4J;ZmTLd&}6dtX=35BOY~sdXIVFxatW9wQmp8F*Ra? zd0D*xc?-m|OfcRt8Oo&mtFuqB2Rm8vM^wps?*+754{#wJ14?t<14=y9DE&i*#orID zn&L1wm6l&}`0Gi>ExNp)hfr61?~YOnY2Kys%sX`b^OXgs3@qDr3Ec|D6tXimW77)j zbz2i-Hl~fj7j7h|9RP&tW0yowlOp4DhMBg~USMKCQAmguJ_n6MrFy!vr=ETR7%z4_ zwg~ldZWtcq6m9lXR@Q9_D_^A2tG4*CH>;Z?u0HDiL2!rr5h#m0X(zGiO9%ZF{I)aR z{)6^dIV5jUiDxtug<#W-YF{1*g4U5AIl8cH>RCpeeRb@!)B5Dj0$MD;xDt;e=;KJG zhIWaO|MuLTQ9ZAZ>W;w(R=N4F5*ryq!47oS(BH3Cm+?vG)70ItW?G=%T$OWCzZ|k-eqE zcdfH80WU!BMg~|AcSYTY5jUu;sr&@}--qd6DO=2N-yX)tXe!CF9<6x!nG!<+7i24Nc0~JSm{VWpkU;6NLmrdctwB_uD1KkR(Wwj5s;WH-}{&RQvGwa&+C;oPRt^+pQEX zHZqaqm?Y@Hc-eo!Dg{eABI5$+FRk#*V-H+N!_3F6mA@w_7e8#?rk2eV3_B-72+iQ0wdxlZM`^Q4NO!WC2qDkhw;$Z?bfEj5r{T9xeRY%S z`FUgytF8@^XcXAUEvbr${sY}q&0@Q%wSM0C6PM&3?qoU?vt`XBMtlAOEo+I9MQ5(T z`S5?VfLi{R*n#a&>)ooyD(=!-EHxm`fSk0YflsVmZC_mI?#KmZCdN|LN|s4|0KMe= zL&0SKM=#QPk-HADCKMA7ZcG0NymNOu_0qQ?;R&s3YxMg~K5ej31?(4}cRDDZg7C8Q zaY+~xTJ1{UL2W;L3VUY4-eOUs`1ZV5lwc*^g!EBw7JuoRKAHs|_axg-_U;Sacf}ID zaQTs?roA51uRyWl-anXLhYoj9`bhmQg*HdWJSb8ePD0Qjs6%L6O`P^U*f3Q z%4|4iE$P3rc34yJTK+E2Gn}gTi2pG6>;WaqEb?{a%EGSu`@-ZmdpGL(K}YXR0lA`r zgpiPqM`!f$LIlhDUZ}phG%uEi1bMYPSzfuoo2A}Tt;(9mngxvHa`fn7u}8ZdLm`d@xkK3PTb)Ce+q3PZ zkm{d&gMM%7dyU*6K-E)Jr^K{JQPD(lW#7}!szR$$cm7HeyM7Z`VDa>c7LaPZWJ4s~ zZbHfBj(U56tMTj(hk>_8B>f++t5i2?IpRy6`rvodFpkW7eK6zokFCr;43+|YUhTH8 z?=C@@9Uddv5ej9kuG*s%mZZg8?V5_QD9Q_zHnp_Ls&Qk(quqlEO7y0WJO3k$~J9 znOnAMqHbXzR2;KaOnPW3N`-X-oucV8ko--(B9A~D;yQg;|9VOF`aR);PPT^G0jiGv}u~^;r{ULS{|NQSS5swSQJsCajD9)UZ-yw+FW>B_?E@KCvw2UGG+48Ux|0zrK))a2;WoIBHJN1;XJD^YVp0 z{v#6exF|*9S2ykowp0&De!48>^FwQPWt`4FW6{n7?9v@l0ezdZhNvg1A6&Lxf^_a- zh3`e=LEM9k6n8;@MD;UCoi*7q<^Vih&4Mo_bp;_rtCW1!<4#i^(l()j6s4SV;ZnhO zI8dYsiE}SMzicl}hK;->e;#_!b*Ik~;q=^5WEI?)F=f^4wOJQz9WkN49JOMaZ(6CwzrpBWeO)~D$OX;k2ifLv36+vF}EB;P1~YrPeV4i_qQ4oCYG>u)?1 zbMK0&#MAWmc!HZgM@fOQp{)!h6Qw51Mj$4Pi=`lETEUMa3*oBZqo0rn!os91GO-D^Y6M2y3TG-Yae<4%h5Ne_8%b*>guNxy8^_ z{8s_Ly7Y(g@LoNh0~;m#fU1q+hZIg67nc0ZneV?a0>(C8v*&_vV3lSKviqX|QfG~K zA^U7)>xfstn-C9ew_;GWMvq#LT$)2{~k5_(Uj4z!<+SIwnHmJ^2C_4?;pNE&))cyHo z82fngw~kX;WFhv_l1Zm?kGjax4>=4rXrkH_l(%+;WGB@j`+V*D@m*({*wOR)G5=DV zGi2|y1gDYlDN+h2BuV^={p6idSCe)1!v6?lm)MEg)y-hT*YE9*zFnqru1kqgWfn;a zBw>f^%~es}wV-b>0KD0+dip5$!HHuF@~@YrE=qu&_Hb2@fn}lea7U zf~?kc*BlT%-*nxDm8r}U6n*%A-mQ&FRRMk{;*cEMI!}UNCFGDH^mszAN(hm3D4rph z=_hBEFR^dbQ;i{9@=^=a0Ozrh-MUr$f3ck)y!Y?V|ATR|v&)rj+X$E!0bfs}rxog0 zH%jCfMgx}HAysY(WneIH0nBxXI{!D}^z;KG@l&zt|z~2--50=K(cX znqYk*G#`~FgZK^N6U1QM;V*@_O*teKKo%~+s(`>w)3!xnok^V@CTj}|UGeJwoE(#a zc^Gc1krJQTDrl-8*fADw1&SCbY*z5C042y|s~lSVZe1Gn!nwM|YzQ+Ln3Pv5B}50I zvAPCX@*{98?($lyLHJH3L*|j2AyDYX&?T3)0}&6NZ9TY|hQ zL9;J%Y3lc()_-F;y|5Pu6L_sgce;hvfoPwCd1|E5D(rdU3`#kV#UMAqlTVpX<*Wu) z%Wu(0++R~(9WS>ay@&}wfiFS@K{5#N#l;D5>EVA@1P?5PjDv=YTZtnQa%>aerGST3 zSi6NUr(2}=4Fc9V*RtheL$cGPL#=hbj{5xNz#9-4gW?abChQSP*v0N|515$x*4Vh$ z9s#}q$B5H|9h9dH&PP($edp4_ml5sTP&x~rr+WEM!H!Jd@qm2k>wE~BWwEY07!*E$ zxhk0P7=?PV&G`C#=>^EY27>DYV>vl#TywDP%_!)vItL&w!e|X11p`9jyS80Or${-5?hwqDS!x=c8=O^1r zQuhSy-+&S1t^9e4*$F~9CQCZ>dx8qI3FW69K^2x~}E?}I2z&q5{S7?hpUq1;D1s2pN~RpXL} zwG_)P>zRe03=t4UbWjgWU4V<^U*Dqlx1Ua1h-0D5Y@naeWVqVF0x_`#j#cNk^{NBurYqN(gbZOrx!OWKmUe?zM?!L08gca_lv-4Fy2 z;_rYx_Cg_{D~3fALPC!Wx5D&RmVLmNk;CM-h^N3^0lU~+>UaczVPhXmLSYzxkm!l! zLO%PdvtX$s>BmFRKJ7gWUsrjQHU<*u!$Aaq$pg=ijpK?GMq*})>gItSDyeB9cB^s}=^LKDWF~%pKr_L5qX#D)5)kLoN05dT-4etF%6<^GGGc zjH$j`HtEBhlNn#kJnL|o84-_sN5=d#wCSEFn?K;}D|6CbDuCcCAmCmLWT8auX8o!v ziQ-v2j&`iY2qDL-KVv^x>jI|mufM;(oWt}PCNt>d?dUoetqLz#I`!9?54*q#q>Hl^ z<+Njs-mHBzu3|0DdIevpOshEFfVq>0O~7{M(yGyYFf^|bGrdM5aPTr8D$h&(@h?FU zJ^#qE09GfrT}{DiIT`E}6{Q%?DL+X#+ZdOK_hK-{^D$CWfKpX`-0uq1F(U|ENKjmLl2b<*L zFgiG57kZO7)S15lrgvAzoJLBFW0w0DAy@@I+8Ko1b)eZc?TT*`@i?;Ak-Tcg8$V_D z$`y8_^UmUnJFS$}_Dgmr2e!IIZgV0{BzTj_$-Xn!v*)5Kj zm?wqJ^)TqgXNM3p)J;Ihs{lm~vDf6Sx%pV>dLmb8$3H@~VnOCXEPS9OfXrl)Y6B^=AI|Kv{shkn@Hf z)?0|UPdfhz22@oqNMO8b+~;j&;0~J?YE=_A9Iq^PieElY`FcEe`lP#;gL7ZN8LEeQ z-P(YTQU<4OJH|4ABIvE9U}}$1wZPK64})|4x8bOnO5-Aec(Kco$;#d>!IiwgyYW&TWS<%RJVe*HJZSp0vC!pkfYzQHUn zOa%R}IoQs@izfLWE#UvnF?^XvfIR<2UYThj-%c2g#MBb|MIl*Wb*Q_^R-||&KoS4_ z`Ty750spri8G=l=T%N*KKLZ#6xfLM{EV30D9ALao`J{Lfa1t=n% z9|7qS;uz>*9`-E3^#N)Sg@H+KXT?3>fgb0l`-7#$FhdkodgkcEBk>|Dsh) zItYdl7=UO_6Ex-=ZvTXIjQXJ8tp~!ow9Au;1|$-KxF*iPv@p^kigrsMItTzjZ5UKx+7a%v#3bOLlmRE# zNDcmM2ecRvDHeouAiqUXuolrQnvTCdzbdTTOGqJoovUmNd5(vsOx)Z+WPu)m%72}d zHR&HQ=t+hSfGr17Ou&n1VYcrYP_+ZR#Er^7YAj z4>yQyoavGQz2;Yf7W)sr{Kk#7DC~I>e;r>1iLzrog-($UGgSmVBCb){M{q?0 zgb{Ipxqjz{N8Gg}@ae@TVT9`evS3I6$cn974DZh`s%%j3(TAlyqBV$xkirp6$sW>0 z8kb1;6GBh&1*X=yhtU~8E9D(Gem`L~g z*QCorGKAmat;WC>JKshgY*4#-GpIAXUR_8*Iwm%veYe<}B?E|IPBM#J$tP)4^mr3I zO9tKglN99H(q0qHGZ#g3ns$#v7@?<&6|?!3BrdAWN*Wa)Lx>raK{jufyp#=`eXNJ@ zP6LdWK&uAhi^#@z7eRJhf+0Ih+^ds>4NQ2qh^Bj<>uFR#8p(p3;e^OTEx+iWmz z1nMfBgznOLr&{RG{O^efVuLxEK93f!+ynkW1sMtIr_w=W;pU8UDhs6`8^RC{BLY62 z@5M&Vdc8⩔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

eEng7ICTJO$s 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 literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-custom-dark.png b/docs/pr-screenshots/pap-2944/skills-custom-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f5cb1e189c99fce1b4664a9ef8e49e31890def GIT binary patch literal 89572 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 literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-empty-library-dark.png b/docs/pr-screenshots/pap-2944/skills-empty-library-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bee4fd1e0c4e27ececb0f7d7260ffb6fe3e57e56 GIT binary patch literal 41597 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 literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-empty-library-light.png b/docs/pr-screenshots/pap-2944/skills-empty-library-light.png new file mode 100644 index 0000000000000000000000000000000000000000..80fa0636bcdde0212600d7fe8ab9e110cb863aa3 GIT binary patch literal 41503 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 literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-loading-dark.png b/docs/pr-screenshots/pap-2944/skills-loading-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..93c58be09856d172e43e1c77e16cf39d29ec9ecc GIT binary patch literal 37171 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 z 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 MY97f{Jazql0FruqZ~y=R literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-loading-light.png b/docs/pr-screenshots/pap-2944/skills-loading-light.png new file mode 100644 index 0000000000000000000000000000000000000000..61c0ceea59c816c49faf3ae7162143a0fb6548bf GIT binary patch literal 37151 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 {jIWwSDyeokjJ~ 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 M)YHgOKX&n70E+;9$^ZZW literal 0 HcmV?d00001 diff --git a/packages/adapter-utils/src/command-redaction.ts b/packages/adapter-utils/src/command-redaction.ts new file mode 100644 index 00000000..9a5f3716 --- /dev/null +++ b/packages/adapter-utils/src/command-redaction.ts @@ -0,0 +1,21 @@ +export const REDACTED_COMMAND_TEXT_VALUE = "***REDACTED***"; + +const COMMAND_CLI_SECRET_OPTION_RE = + /(\B-{1,2}(?:api[-_]?key|(?:access[-_]?|auth[-_]?)?token|token|authorization|bearer|secret|passwd|password|credential|jwt|private[-_]?key|cookie|connectionstring)(?:\s+|=)(["']?))[^\s"'`]+(\2)/gi; +const COMMAND_ENV_SECRET_ASSIGNMENT_RE = + /(\b[A-Za-z0-9_]*(?:TOKEN|KEY|SECRET|PASSWORD|PASSWD|AUTHORIZATION|JWT)[A-Za-z0-9_]*\s*=\s*)[^\s"'`]+/gi; +const COMMAND_AUTHORIZATION_BEARER_RE = /(\bAuthorization\s*:\s*Bearer\s+)[^\s"'`]+/gi; +const COMMAND_OPENAI_KEY_RE = /\bsk-[A-Za-z0-9_-]{12,}\b/g; +const COMMAND_GITHUB_TOKEN_RE = /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g; +const COMMAND_JWT_RE = + /\b[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}(?:\.[A-Za-z0-9_-]{8,})?\b/g; + +export function redactCommandText(command: string, redactedValue = REDACTED_COMMAND_TEXT_VALUE): string { + return command + .replace(COMMAND_AUTHORIZATION_BEARER_RE, `$1${redactedValue}`) + .replace(COMMAND_CLI_SECRET_OPTION_RE, `$1${redactedValue}$3`) + .replace(COMMAND_ENV_SECRET_ASSIGNMENT_RE, `$1${redactedValue}`) + .replace(COMMAND_OPENAI_KEY_RE, redactedValue) + .replace(COMMAND_GITHUB_TOKEN_RE, redactedValue) + .replace(COMMAND_JWT_RE, redactedValue); +} diff --git a/packages/adapter-utils/src/index.ts b/packages/adapter-utils/src/index.ts index c563ab21..0c144b7a 100644 --- a/packages/adapter-utils/src/index.ts +++ b/packages/adapter-utils/src/index.ts @@ -55,6 +55,10 @@ export { redactHomePathUserSegmentsInValue, redactTranscriptEntryPaths, } from "./log-redaction.js"; +export { + REDACTED_COMMAND_TEXT_VALUE, + redactCommandText, +} from "./command-redaction.js"; export { inferOpenAiCompatibleBiller } from "./billing.js"; // Keep the root adapter-utils entry browser-safe because the UI imports it. // The sandbox callback bridge stays available via its dedicated subpath export. diff --git a/packages/adapter-utils/src/server-utils.test.ts b/packages/adapter-utils/src/server-utils.test.ts index f5e8f716..16ad5303 100644 --- a/packages/adapter-utils/src/server-utils.test.ts +++ b/packages/adapter-utils/src/server-utils.test.ts @@ -1,9 +1,14 @@ import { randomUUID } from "node:crypto"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; import { describe, expect, it } from "vitest"; import { applyPaperclipWorkspaceEnv, appendWithByteCap, + buildInvocationEnvForLogs, DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE, + materializePaperclipSkillCopy, renderPaperclipWakePrompt, runningProcesses, runChildProcess, @@ -39,6 +44,82 @@ async function waitForTextMatch(read: () => string, pattern: RegExp, timeoutMs = return read().match(pattern); } +describe("buildInvocationEnvForLogs", () => { + it("redacts inline secrets from resolved command metadata", () => { + const loggedEnv = buildInvocationEnvForLogs( + { SAFE_VALUE: "visible" }, + { + resolvedCommand: "env OPENAI_API_KEY=sk-live-example custom-acp --token ghp_example_secret", + }, + ); + + expect(loggedEnv.SAFE_VALUE).toBe("visible"); + expect(loggedEnv.PAPERCLIP_RESOLVED_COMMAND).toBe( + "env OPENAI_API_KEY=***REDACTED*** custom-acp --token ***REDACTED***", + ); + }); +}); + +describe("materializePaperclipSkillCopy", () => { + it("refuses to materialize into an ancestor of the source", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-skill-copy-")); + try { + const source = path.join(root, "parent", "skill"); + await fs.mkdir(source, { recursive: true }); + await fs.writeFile(path.join(source, "SKILL.md"), "# skill\n", "utf8"); + + await expect(materializePaperclipSkillCopy(source, path.join(root, "parent"))).rejects.toThrow( + /ancestor/, + ); + await expect(fs.readFile(path.join(source, "SKILL.md"), "utf8")).resolves.toBe("# skill\n"); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("does not delete and recopy an unchanged materialized skill target", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-skill-copy-")); + try { + const source = path.join(root, "source"); + const target = path.join(root, "target"); + await fs.mkdir(source, { recursive: true }); + await fs.writeFile(path.join(source, "SKILL.md"), "# skill\n", "utf8"); + + const first = await materializePaperclipSkillCopy(source, target); + expect(first.copiedFiles).toBe(1); + await fs.writeFile(path.join(target, "local-marker.txt"), "keep\n", "utf8"); + + const second = await materializePaperclipSkillCopy(source, target); + expect(second.copiedFiles).toBe(0); + await expect(fs.readFile(path.join(target, "local-marker.txt"), "utf8")).resolves.toBe("keep\n"); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("breaks stale materialization locks left by dead processes", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-skill-copy-")); + try { + const source = path.join(root, "source"); + const target = path.join(root, "target"); + const lock = `${target}.lock`; + await fs.mkdir(source, { recursive: true }); + await fs.writeFile(path.join(source, "SKILL.md"), "# skill\n", "utf8"); + await fs.mkdir(lock, { recursive: true }); + await fs.writeFile( + path.join(lock, "owner.json"), + JSON.stringify({ pid: 999_999_999, createdAt: "2000-01-01T00:00:00.000Z" }), + "utf8", + ); + + await expect(materializePaperclipSkillCopy(source, target)).resolves.toMatchObject({ copiedFiles: 1 }); + await expect(fs.readFile(path.join(target, "SKILL.md"), "utf8")).resolves.toBe("# skill\n"); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); +}); + describe("runChildProcess", () => { it("does not arm a timeout when timeoutSec is 0", async () => { const result = await runChildProcess( diff --git a/packages/adapter-utils/src/server-utils.ts b/packages/adapter-utils/src/server-utils.ts index 425a1f3f..bb4eb40d 100644 --- a/packages/adapter-utils/src/server-utils.ts +++ b/packages/adapter-utils/src/server-utils.ts @@ -1,7 +1,9 @@ import { spawn, type ChildProcess } from "node:child_process"; +import { createHash, randomUUID } from "node:crypto"; import { constants as fsConstants, promises as fs, type Dirent } from "node:fs"; import path from "node:path"; import { buildSshSpawnTarget, type SshRemoteExecutionSpec } from "./ssh.js"; +import { redactCommandText } from "./command-redaction.js"; import type { AdapterSkillEntry, AdapterSkillSnapshot, @@ -76,10 +78,14 @@ export const MAX_CAPTURE_BYTES = 4 * 1024 * 1024; export const MAX_EXCERPT_BYTES = 32 * 1024; const TERMINAL_RESULT_SCAN_OVERLAP_CHARS = 64 * 1024; const SENSITIVE_ENV_KEY = /(key|token|secret|password|passwd|authorization|cookie)/i; +const REDACTED_LOG_VALUE = "***REDACTED***"; const PAPERCLIP_SKILL_ROOT_RELATIVE_CANDIDATES = [ "../../skills", "../../../../../skills", ]; +const MATERIALIZED_SKILL_SENTINEL = ".paperclip-materialized-skill.json"; +const MATERIALIZED_SKILL_LOCK_OWNER = "owner.json"; +const MATERIALIZED_SKILL_LOCK_STALE_MS = 30_000; export const DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE = [ "You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.", @@ -111,6 +117,11 @@ export interface InstalledSkillTarget { kind: "symlink" | "directory" | "file"; } +export interface MaterializedPaperclipSkillCopyResult { + copiedFiles: number; + skippedSymlinks: string[]; +} + interface PersistentSkillSnapshotOptions { adapterType: string; availableEntries: PaperclipSkillEntry[]; @@ -780,11 +791,15 @@ export function renderPaperclipWakePrompt( export function redactEnvForLogs(env: Record): Record { const redacted: Record = {}; for (const [key, value] of Object.entries(env)) { - redacted[key] = SENSITIVE_ENV_KEY.test(key) ? "***REDACTED***" : value; + redacted[key] = SENSITIVE_ENV_KEY.test(key) ? REDACTED_LOG_VALUE : value; } return redacted; } +export function redactCommandTextForLogs(command: string): string { + return redactCommandText(command, REDACTED_LOG_VALUE); +} + export function buildInvocationEnvForLogs( env: Record, options: { @@ -806,7 +821,7 @@ export function buildInvocationEnvForLogs( const resolvedCommand = options.resolvedCommand?.trim(); if (resolvedCommand) { - merged[options.resolvedCommandEnvKey ?? "PAPERCLIP_RESOLVED_COMMAND"] = resolvedCommand; + merged[options.resolvedCommandEnvKey ?? "PAPERCLIP_RESOLVED_COMMAND"] = redactCommandTextForLogs(resolvedCommand); } return redactEnvForLogs(merged); @@ -1395,6 +1410,190 @@ export async function ensurePaperclipSkillSymlink( return "repaired"; } +async function hashSkillDirectory(root: string): Promise { + const hash = createHash("sha256"); + + async function visit(candidate: string, relativePath: string): Promise { + const stat = await fs.lstat(candidate); + if (stat.isSymbolicLink()) { + hash.update(`symlink:${relativePath}\n`); + return; + } + if (stat.isDirectory()) { + hash.update(`dir:${relativePath}\n`); + const entries = await fs.readdir(candidate, { withFileTypes: true }); + entries.sort((left, right) => left.name.localeCompare(right.name)); + for (const entry of entries) { + const childRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name; + await visit(path.join(candidate, entry.name), childRelativePath); + } + return; + } + if (stat.isFile()) { + hash.update(`file:${relativePath}:${stat.mode}\n`); + hash.update(await fs.readFile(candidate)); + hash.update("\n"); + return; + } + hash.update(`other:${relativePath}:${stat.mode}\n`); + } + + await visit(root, ""); + return hash.digest("hex"); +} + +async function materializedSkillFingerprintMatches(targetRoot: string, sourceFingerprint: string): Promise { + try { + const raw = JSON.parse(await fs.readFile(path.join(targetRoot, MATERIALIZED_SKILL_SENTINEL), "utf8")) as unknown; + const parsed = parseObject(raw); + return parsed.version === 1 && parsed.sourceFingerprint === sourceFingerprint; + } catch { + return false; + } +} + +async function acquireMaterializeLock(lockDir: string): Promise<() => Promise> { + await fs.mkdir(path.dirname(lockDir), { recursive: true }); + const deadline = Date.now() + MATERIALIZED_SKILL_LOCK_STALE_MS; + while (true) { + try { + await fs.mkdir(lockDir); + await fs.writeFile( + path.join(lockDir, MATERIALIZED_SKILL_LOCK_OWNER), + `${JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() })}\n`, + "utf8", + ); + return async () => { + await fs.rm(lockDir, { recursive: true, force: true }); + }; + } catch (err) { + const code = err && typeof err === "object" ? (err as { code?: unknown }).code : null; + if (code !== "EEXIST") throw err; + if (await removeStaleMaterializeLock(lockDir, MATERIALIZED_SKILL_LOCK_STALE_MS)) continue; + if (Date.now() >= deadline) { + throw new Error(`Timed out waiting for Paperclip skill materialization lock at ${lockDir}`); + } + await new Promise((resolve) => setTimeout(resolve, 50)); + } + } +} + +function isPidAlive(pid: number): boolean { + if (!Number.isInteger(pid) || pid <= 0) return false; + try { + process.kill(pid, 0); + return true; + } catch (err) { + const code = err && typeof err === "object" ? (err as { code?: unknown }).code : null; + return code === "EPERM"; + } +} + +async function removeStaleMaterializeLock(lockDir: string, staleMs: number): Promise { + const ownerPath = path.join(lockDir, MATERIALIZED_SKILL_LOCK_OWNER); + let shouldRemove = false; + try { + const raw = JSON.parse(await fs.readFile(ownerPath, "utf8")) as unknown; + const owner = parseObject(raw); + const pid = typeof owner.pid === "number" ? owner.pid : 0; + const createdAt = typeof owner.createdAt === "string" ? Date.parse(owner.createdAt) : Number.NaN; + const ageMs = Number.isFinite(createdAt) ? Date.now() - createdAt : staleMs + 1; + shouldRemove = !isPidAlive(pid) || ageMs > staleMs; + } catch { + const stat = await fs.stat(lockDir).catch(() => null); + shouldRemove = !stat || Date.now() - stat.mtimeMs > staleMs; + } + if (!shouldRemove) return false; + await fs.rm(lockDir, { recursive: true, force: true }).catch(() => {}); + return true; +} + +export async function materializePaperclipSkillCopy( + source: string, + target: string, +): Promise { + const sourceRoot = path.resolve(source); + const targetRoot = path.resolve(target); + const relativeTarget = path.relative(sourceRoot, targetRoot); + const relativeSource = path.relative(targetRoot, sourceRoot); + if ( + !relativeTarget || + (!relativeTarget.startsWith("..") && !path.isAbsolute(relativeTarget)) || + !relativeSource || + (!relativeSource.startsWith("..") && !path.isAbsolute(relativeSource)) + ) { + throw new Error("Refusing to materialize a skill into itself, an ancestor, or one of its descendants."); + } + + const rootStat = await fs.lstat(sourceRoot); + if (rootStat.isSymbolicLink()) { + throw new Error("Refusing to materialize a skill root that is itself a symlink."); + } + if (!rootStat.isDirectory()) { + throw new Error("Paperclip skills must be directories."); + } + + const result: MaterializedPaperclipSkillCopyResult = { + copiedFiles: 0, + skippedSymlinks: [], + }; + + const lockDir = `${targetRoot}.lock`; + const releaseLock = await acquireMaterializeLock(lockDir); + const tempRoot = `${targetRoot}.tmp-${process.pid}-${randomUUID()}`; + + async function copyEntry(sourcePath: string, targetPath: string, relativePath: string): Promise { + const stat = await fs.lstat(sourcePath); + if (stat.isSymbolicLink()) { + result.skippedSymlinks.push(relativePath || "."); + return; + } + + if (stat.isDirectory()) { + await fs.mkdir(targetPath, { recursive: true }); + const entries = await fs.readdir(sourcePath, { withFileTypes: true }); + entries.sort((left, right) => left.name.localeCompare(right.name)); + for (const entry of entries) { + const childRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name; + await copyEntry(path.join(sourcePath, entry.name), path.join(targetPath, entry.name), childRelativePath); + } + return; + } + + if (stat.isFile()) { + await fs.mkdir(path.dirname(targetPath), { recursive: true }); + await fs.copyFile(sourcePath, targetPath, fsConstants.COPYFILE_FICLONE).catch(async () => { + await fs.copyFile(sourcePath, targetPath); + }); + await fs.chmod(targetPath, stat.mode).catch(() => {}); + result.copiedFiles += 1; + } + } + + try { + const sourceFingerprint = await hashSkillDirectory(sourceRoot); + if (await materializedSkillFingerprintMatches(targetRoot, sourceFingerprint)) return result; + await copyEntry(sourceRoot, tempRoot, ""); + await fs.writeFile( + path.join(tempRoot, MATERIALIZED_SKILL_SENTINEL), + `${JSON.stringify({ + version: 1, + sourceFingerprint, + copiedFiles: result.copiedFiles, + skippedSymlinks: result.skippedSymlinks, + }, null, 2)}\n`, + "utf8", + ); + if (await materializedSkillFingerprintMatches(targetRoot, sourceFingerprint)) return result; + await fs.rm(targetRoot, { recursive: true, force: true }); + await fs.rename(tempRoot, targetRoot); + return result; + } finally { + await fs.rm(tempRoot, { recursive: true, force: true }).catch(() => {}); + await releaseLock(); + } +} + export async function removeMaintainerOnlySkillSymlinks( skillsHome: string, allowedSkillNames: Iterable, diff --git a/packages/adapter-utils/src/session-compaction.ts b/packages/adapter-utils/src/session-compaction.ts index 90fe544b..c42cbf8f 100644 --- a/packages/adapter-utils/src/session-compaction.ts +++ b/packages/adapter-utils/src/session-compaction.ts @@ -37,6 +37,7 @@ const ADAPTER_MANAGED_SESSION_POLICY: SessionCompactionPolicy = { }; export const LEGACY_SESSIONED_ADAPTER_TYPES = new Set([ + "acpx_local", "claude_local", "codex_local", "cursor", @@ -47,6 +48,11 @@ export const LEGACY_SESSIONED_ADAPTER_TYPES = new Set([ ]); export const ADAPTER_SESSION_MANAGEMENT: Record = { + acpx_local: { + supportsSessionResume: true, + nativeContextManagement: "confirmed", + defaultSessionCompaction: ADAPTER_MANAGED_SESSION_POLICY, + }, claude_local: { supportsSessionResume: true, nativeContextManagement: "confirmed", diff --git a/packages/adapters/acpx-local/package.json b/packages/adapters/acpx-local/package.json new file mode 100644 index 00000000..b061a113 --- /dev/null +++ b/packages/adapters/acpx-local/package.json @@ -0,0 +1,64 @@ +{ + "name": "@paperclipai/adapter-acpx-local", + "version": "0.3.1", + "license": "MIT", + "homepage": "https://github.com/paperclipai/paperclip", + "bugs": { + "url": "https://github.com/paperclipai/paperclip/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/paperclipai/paperclip", + "directory": "packages/adapters/acpx-local" + }, + "type": "module", + "exports": { + ".": "./src/index.ts", + "./server": "./src/server/index.ts", + "./ui": "./src/ui/index.ts", + "./cli": "./src/cli/index.ts" + }, + "publishConfig": { + "access": "public", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./server": { + "types": "./dist/server/index.d.ts", + "import": "./dist/server/index.js" + }, + "./ui": { + "types": "./dist/ui/index.d.ts", + "import": "./dist/ui/index.js" + }, + "./cli": { + "types": "./dist/cli/index.d.ts", + "import": "./dist/cli/index.js" + } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "files": [ + "dist", + "skills" + ], + "scripts": { + "build": "tsc", + "clean": "rm -rf dist", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentclientprotocol/claude-agent-acp": "^0.31.4", + "@paperclipai/adapter-utils": "workspace:*", + "@zed-industries/codex-acp": "^0.12.0", + "acpx": "^0.6.1", + "picocolors": "^1.1.1" + }, + "devDependencies": { + "@types/node": "^24.6.0", + "typescript": "^5.7.3" + } +} diff --git a/packages/adapters/acpx-local/src/cli/format-event.test.ts b/packages/adapters/acpx-local/src/cli/format-event.test.ts new file mode 100644 index 00000000..34e2b6b3 --- /dev/null +++ b/packages/adapters/acpx-local/src/cli/format-event.test.ts @@ -0,0 +1,121 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { printAcpxStreamEvent } from "./format-event.js"; + +function emit(payload: Record): string { + return JSON.stringify(payload); +} + +interface CapturedOutput { + log: string[]; + stdout: string[]; +} + +function captureOutput(): { capture: CapturedOutput; restore: () => void } { + const log: string[] = []; + const stdout: string[] = []; + const logSpy = vi.spyOn(console, "log").mockImplementation((value?: unknown) => { + log.push(String(value ?? "")); + }); + const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(((chunk: unknown) => { + stdout.push(String(chunk ?? "")); + return true; + }) as typeof process.stdout.write); + return { + capture: { log, stdout }, + restore: () => { + logSpy.mockRestore(); + stdoutSpy.mockRestore(); + }, + }; +} + +function strip(value: string): string { + return value.replace(/\x1b\[[0-9;]*m/g, ""); +} + +describe("printAcpxStreamEvent", () => { + let captured: CapturedOutput; + let restore: () => void; + + beforeEach(() => { + const result = captureOutput(); + captured = result.capture; + restore = result.restore; + }); + + afterEach(() => { + restore(); + }); + + it("renders acpx.session as a labeled session header", () => { + printAcpxStreamEvent( + emit({ + type: "acpx.session", + agent: "claude", + acpSessionId: "acp-1", + mode: "persistent", + permissionMode: "approve-all", + }), + false, + ); + expect(captured.log.map(strip)).toEqual(["claude session: acp-1 [persistent / approve-all]"]); + }); + + it("streams output text_delta to stdout for live progress", () => { + printAcpxStreamEvent( + emit({ type: "acpx.text_delta", text: "hello", channel: "output" }), + false, + ); + expect(captured.log).toEqual([]); + expect(captured.stdout.map(strip)).toEqual(["hello"]); + }); + + it("renders thought text_delta on its own line", () => { + printAcpxStreamEvent( + emit({ type: "acpx.text_delta", text: "thinking…", channel: "thought" }), + false, + ); + expect(captured.log.map(strip)).toEqual(["thinking…"]); + }); + + it("renders tool_call with status and id", () => { + printAcpxStreamEvent( + emit({ + type: "acpx.tool_call", + name: "read", + toolCallId: "tool-1", + status: "running", + text: "read README.md", + }), + false, + ); + expect(captured.log.map(strip)).toEqual([ + "tool_call: read [running] (tool-1)", + "read README.md", + ]); + }); + + it("renders status events with optional context window", () => { + printAcpxStreamEvent( + emit({ type: "acpx.status", tag: "context_window", used: 100, size: 200000 }), + false, + ); + expect(captured.log.map(strip)).toEqual(["status: context_window (100/200000 ctx)"]); + }); + + it("renders acpx.result and acpx.error", () => { + printAcpxStreamEvent(emit({ type: "acpx.result", summary: "completed", stopReason: "end_turn" }), false); + printAcpxStreamEvent(emit({ type: "acpx.error", message: "auth required" }), false); + expect(captured.log.map(strip)).toEqual(["result: completed", "error: auth required"]); + }); + + it("falls back to plain output for non-JSON lines", () => { + printAcpxStreamEvent("not json", false); + expect(captured.log).toEqual(["not json"]); + }); + + it("still emits unknown / non-JSON lines when debug is enabled", () => { + printAcpxStreamEvent("not json", true); + expect(strip(captured.log[0])).toBe("not json"); + }); +}); diff --git a/packages/adapters/acpx-local/src/cli/format-event.ts b/packages/adapters/acpx-local/src/cli/format-event.ts new file mode 100644 index 00000000..9794ba13 --- /dev/null +++ b/packages/adapters/acpx-local/src/cli/format-event.ts @@ -0,0 +1,121 @@ +import pc from "picocolors"; + +function parseJson(line: string): Record | null { + try { + const parsed = JSON.parse(line); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null; + return parsed as Record; + } catch { + return null; + } +} + +function asString(value: unknown, fallback = ""): string { + return typeof value === "string" ? value : fallback; +} + +function asNumber(value: unknown, fallback = 0): number { + return typeof value === "number" && Number.isFinite(value) ? value : fallback; +} + +function stringify(value: unknown): string { + if (typeof value === "string") return value; + if (value === null || value === undefined) return ""; + try { + return JSON.stringify(value, null, 2); + } catch { + return String(value); + } +} + +function pickToolUseId(parsed: Record): string { + return ( + asString(parsed.toolCallId) || + asString(parsed.toolUseId) || + asString(parsed.id) + ); +} + +function statusLine(parsed: Record): string { + const text = asString(parsed.text).trim(); + const tag = asString(parsed.tag).trim(); + const used = asNumber(parsed.used, -1); + const size = asNumber(parsed.size, -1); + const parts: string[] = []; + if (text) parts.push(text); + if (tag && !text) parts.push(tag); + if (used >= 0 && size > 0) parts.push(`(${used}/${size} ctx)`); + return parts.join(" ") || tag || "status"; +} + +export function printAcpxStreamEvent(raw: string, debug: boolean): void { + const line = raw.trim(); + if (!line) return; + const parsed = parseJson(line); + if (!parsed) { + if (debug) console.log(pc.gray(line)); + else console.log(line); + return; + } + + const type = asString(parsed.type); + if (type === "acpx.session") { + const agent = asString(parsed.agent, "acpx"); + const session = + asString(parsed.acpSessionId) || + asString(parsed.sessionId) || + asString(parsed.runtimeSessionName); + const mode = asString(parsed.mode); + const permissionMode = asString(parsed.permissionMode); + const tail = [mode, permissionMode].filter(Boolean).join(" / "); + const suffix = tail ? ` [${tail}]` : ""; + console.log(pc.blue(`${agent} session${session ? `: ${session}` : ""}${suffix}`)); + return; + } + if (type === "acpx.text_delta") { + const text = asString(parsed.text); + if (!text) return; + const channel = asString(parsed.channel) || asString(parsed.stream); + const isThought = channel === "thought" || channel === "thinking"; + if (isThought) console.log(pc.gray(text)); + else process.stdout.write(pc.green(text)); + return; + } + if (type === "acpx.tool_call") { + const name = asString(parsed.name, "acp_tool"); + const status = asString(parsed.status); + const id = pickToolUseId(parsed); + const header = status ? `tool_call: ${name} [${status}]` : `tool_call: ${name}`; + const idSuffix = id ? ` (${id})` : ""; + const isError = status === "failed" || status === "cancelled"; + console.log((isError ? pc.red : pc.yellow)(`${header}${idSuffix}`)); + if (parsed.input !== undefined) { + console.log(pc.gray(stringify(parsed.input))); + } else { + const text = asString(parsed.text).trim(); + if (text) console.log(pc.gray(text)); + } + return; + } + if (type === "acpx.tool_result") { + const isError = parsed.isError === true || parsed.error !== undefined; + console.log((isError ? pc.red : pc.cyan)(`tool_result: ${asString(parsed.name, "acp_tool")}`)); + const content = stringify(parsed.content ?? parsed.output ?? parsed.error); + if (content) console.log((isError ? pc.red : pc.gray)(content)); + return; + } + if (type === "acpx.status") { + console.log(pc.gray(`status: ${statusLine(parsed)}`)); + return; + } + if (type === "acpx.result") { + const summary = asString(parsed.summary, asString(parsed.stopReason, asString(parsed.subtype, "complete"))); + console.log(pc.blue(`result: ${summary}`)); + return; + } + if (type === "acpx.error") { + console.log(pc.red(`error: ${asString(parsed.message, line)}`)); + return; + } + console.log(debug ? pc.gray(line) : line); +} diff --git a/packages/adapters/acpx-local/src/cli/index.ts b/packages/adapters/acpx-local/src/cli/index.ts new file mode 100644 index 00000000..51a60e2a --- /dev/null +++ b/packages/adapters/acpx-local/src/cli/index.ts @@ -0,0 +1 @@ +export { printAcpxStreamEvent } from "./format-event.js"; diff --git a/packages/adapters/acpx-local/src/index.ts b/packages/adapters/acpx-local/src/index.ts new file mode 100644 index 00000000..1e4933c0 --- /dev/null +++ b/packages/adapters/acpx-local/src/index.ts @@ -0,0 +1,47 @@ +export const type = "acpx_local"; +export const label = "ACPX (local)"; + +export const DEFAULT_ACPX_LOCAL_AGENT = "claude"; +export const DEFAULT_ACPX_LOCAL_MODE = "persistent"; +export const DEFAULT_ACPX_LOCAL_PERMISSION_MODE = "approve-all"; +export const DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS = "deny"; +export const DEFAULT_ACPX_LOCAL_TIMEOUT_SEC = 0; + +export const acpxAgentOptions = [ + { id: "claude", label: "Claude via ACPX" }, + { id: "codex", label: "Codex via ACPX" }, + { id: "custom", label: "Custom ACP command" }, +] as const; + +export const agentConfigurationDoc = `# acpx_local agent configuration + +Adapter: acpx_local + +Use when: +- The agent should run through Agent Client Protocol via ACPX on the Paperclip host or a managed execution environment. +- You want one built-in adapter that can target Claude, Codex, or a custom ACP server command. +- You need Paperclip-managed session identity and live streamed ACP events in later ACPX runtime phases. + +Don't use when: +- You need today's stable Claude Code or Codex CLI wrapper behavior. Use claude_local or codex_local until acpx_local runtime execution is enabled. +- The host cannot satisfy ACPX's Node >=22.12.0 prerequisite. +- The agent runtime is not an ACP server and cannot be launched through ACPX. + +Core fields: +- agent (string, optional): claude, codex, or custom. Defaults to claude. +- agentCommand (string, optional): custom ACP command when agent=custom, or an override for a built-in ACP agent command. +- mode (string, optional): persistent or oneshot. Defaults to persistent. +- cwd (string, optional): default absolute working directory fallback for the agent process. +- permissionMode (string, optional): defaults to approve-all, meaning ACPX permission requests are auto-approved. +- nonInteractivePermissions (string, optional): fallback behavior when ACPX cannot ask interactively. Supported values are deny and fail. +- stateDir (string, optional): ACPX state directory. Defaults to a Paperclip-managed company/agent scoped location. +- instructionsFilePath (string, optional): absolute path to a markdown instructions file used by Paperclip prompt construction. +- promptTemplate (string, optional): run prompt template. +- bootstrapPromptTemplate (string, optional): first-run bootstrap prompt template. +- timeoutSec (number, optional): run timeout in seconds. Defaults to 0, meaning no adapter timeout. +- env (object, optional): KEY=VALUE environment variables or secret bindings. + +Dependency decision: +- acpx_local declares direct dependencies on acpx, @agentclientprotocol/claude-agent-acp, and @zed-industries/codex-acp so the built-in adapter has deterministic package resolution instead of relying on globally installed ACP commands. +- ACPX currently requires Node >=22.12.0. Paperclip keeps the repo-wide Node >=20 engine and surfaces the stricter runtime prerequisite through acpx_local diagnostics. +`; diff --git a/packages/adapters/acpx-local/src/server/config-schema.ts b/packages/adapters/acpx-local/src/server/config-schema.ts new file mode 100644 index 00000000..87100917 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/config-schema.ts @@ -0,0 +1,102 @@ +import type { AdapterConfigSchema } from "@paperclipai/adapter-utils"; +import { + DEFAULT_ACPX_LOCAL_AGENT, + DEFAULT_ACPX_LOCAL_MODE, + DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS, + DEFAULT_ACPX_LOCAL_PERMISSION_MODE, + DEFAULT_ACPX_LOCAL_TIMEOUT_SEC, + acpxAgentOptions, +} from "../index.js"; + +export function getConfigSchema(): AdapterConfigSchema { + return { + fields: [ + { + key: "agent", + label: "ACP agent", + type: "select", + default: DEFAULT_ACPX_LOCAL_AGENT, + required: true, + options: acpxAgentOptions.map((agent) => ({ value: agent.id, label: agent.label })), + hint: "Choose the ACP agent launched through ACPX.", + }, + { + key: "agentCommand", + label: "Agent command", + type: "text", + hint: "Required for custom agents; optional override for built-in Claude or Codex ACP commands.", + }, + { + key: "mode", + label: "Session mode", + type: "select", + default: DEFAULT_ACPX_LOCAL_MODE, + options: [ + { value: "persistent", label: "Persistent" }, + { value: "oneshot", label: "One shot" }, + ], + }, + { + key: "permissionMode", + label: "Permission mode", + type: "select", + default: DEFAULT_ACPX_LOCAL_PERMISSION_MODE, + options: [ + { value: "approve-all", label: "Approve all" }, + { value: "default", label: "Approve reads" }, + ], + hint: "Defaults to maximum permissions. Approve reads grants read-only requests and asks for approval on writes.", + }, + { + key: "nonInteractivePermissions", + label: "Non-interactive permissions", + type: "select", + default: DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS, + options: [ + { value: "deny", label: "Deny" }, + { value: "fail", label: "Fail" }, + ], + }, + { + key: "cwd", + label: "Working directory", + type: "text", + hint: "Absolute fallback directory. Paperclip execution workspaces can override this at runtime.", + }, + { + key: "stateDir", + label: "State directory", + type: "text", + hint: "Optional ACPX session state directory. Defaults to Paperclip-managed company/agent scoped storage.", + }, + { + key: "instructionsFilePath", + label: "Instructions file", + type: "text", + hint: "Optional absolute path to markdown instructions injected into the run prompt.", + }, + { + key: "promptTemplate", + label: "Prompt template", + type: "textarea", + }, + { + key: "bootstrapPromptTemplate", + label: "Bootstrap prompt template", + type: "textarea", + }, + { + key: "timeoutSec", + label: "Timeout seconds", + type: "number", + default: DEFAULT_ACPX_LOCAL_TIMEOUT_SEC, + }, + { + key: "env", + label: "Environment JSON", + type: "textarea", + hint: "Optional JSON object of environment values or secret bindings.", + }, + ], + }; +} diff --git a/packages/adapters/acpx-local/src/server/execute.test.ts b/packages/adapters/acpx-local/src/server/execute.test.ts new file mode 100644 index 00000000..ccdea013 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/execute.test.ts @@ -0,0 +1,362 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; +import { createAcpxLocalExecutor } from "./execute.js"; + +const tempRoots: string[] = []; + +async function makeTempRoot() { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-skills-")); + tempRoots.push(root); + return root; +} + +afterEach(async () => { + await Promise.all(tempRoots.splice(0).map((root) => fs.rm(root, { recursive: true, force: true }))); +}); + +async function pathExists(candidate: string): Promise { + return fs.access(candidate).then(() => true).catch(() => false); +} + +async function onlyChildDir(parent: string): Promise { + const entries = await fs.readdir(parent); + expect(entries).toHaveLength(1); + return path.join(parent, entries[0]!); +} + +async function createSkill(root: string, name: string, body = `---\nrequired: false\n---\n# ${name}\n`) { + const skillDir = path.join(root, name); + await fs.mkdir(skillDir, { recursive: true }); + await fs.writeFile(path.join(skillDir, "SKILL.md"), body, "utf8"); + return { + key: `paperclipai/test/${name}`, + runtimeName: name, + source: skillDir, + required: false, + }; +} + +function buildRuntime() { + return { + ensureSession: async () => ({ + backendSessionId: "backend-session", + agentSessionId: "agent-session", + runtimeSessionName: "runtime-session", + }), + startTurn: () => ({ + events: (async function* () { + yield { type: "done", stopReason: "end_turn" }; + })(), + result: Promise.resolve({ status: "completed", stopReason: "end_turn" }), + cancel: async () => {}, + }), + close: async () => {}, + }; +} + +async function runExecutor(config: Record) { + const runtimeOptions: Record[] = []; + const meta: Record[] = []; + const logs: Array<{ stream: string; text: string }> = []; + const execute = createAcpxLocalExecutor({ + createRuntime: (options) => { + runtimeOptions.push(options as unknown as Record); + return buildRuntime() as never; + }, + }); + + const result = await execute({ + runId: "run-1", + agent: { + id: "agent-1", + companyId: "company-1", + }, + runtime: {}, + config, + context: {}, + onLog: async (stream: "stdout" | "stderr", text: string) => { + logs.push({ stream, text }); + }, + onMeta: async (payload: unknown) => { + meta.push(payload as Record); + }, + } as never); + + expect(result.exitCode).toBe(0); + return { logs, meta, runtimeOptions, result }; +} + +describe("acpx_local runtime skill isolation", () => { + it.skipIf(process.platform === "win32")("materializes ACPX Claude skills without symlinked descendants", async () => { + const root = await makeTempRoot(); + const skillRoot = path.join(root, "skills"); + const outsideRoot = path.join(root, "outside"); + await fs.mkdir(outsideRoot, { recursive: true }); + await fs.writeFile(path.join(outsideRoot, "secret.txt"), "do not expose", "utf8"); + const skill = await createSkill(skillRoot, "danger"); + await fs.symlink(path.join(outsideRoot, "secret.txt"), path.join(skill.source, "leak.txt")); + await fs.symlink(outsideRoot, path.join(skill.source, "leak-dir")); + + const stateDir = path.join(root, "state"); + const { meta } = await runExecutor({ + agent: "claude", + stateDir, + paperclipRuntimeSkills: [skill], + paperclipSkillSync: { desiredSkills: [skill.key] }, + }); + + const mountedRoot = await onlyChildDir(path.join(stateDir, "runtime-skills", "claude")); + const skillsHome = path.join(mountedRoot, ".claude", "skills"); + const materializedSkill = path.join(skillsHome, skill.runtimeName); + expect(await fs.readFile(path.join(materializedSkill, "SKILL.md"), "utf8")).toContain("# danger"); + expect(await pathExists(path.join(materializedSkill, "leak.txt"))).toBe(false); + expect(await pathExists(path.join(materializedSkill, "leak-dir"))).toBe(false); + expect(String(meta[0]?.prompt ?? "")).toContain(`Skill root: ${skillsHome}`); + }); + + it.skipIf(process.platform === "win32")("revokes removed ACPX Codex skills and skips symlinked descendants", async () => { + const root = await makeTempRoot(); + const skillRoot = path.join(root, "skills"); + const outsideRoot = path.join(root, "outside"); + const codexHome = path.join(root, "codex-home"); + await fs.mkdir(outsideRoot, { recursive: true }); + await fs.writeFile(path.join(outsideRoot, "secret.txt"), "do not expose", "utf8"); + const keep = await createSkill(skillRoot, "keep"); + const remove = await createSkill(skillRoot, "remove"); + await fs.symlink(path.join(outsideRoot, "secret.txt"), path.join(keep.source, "leak.txt")); + await fs.symlink(outsideRoot, path.join(keep.source, "leak-dir")); + + const baseConfig = { + agent: "codex", + stateDir: path.join(root, "state"), + env: { CODEX_HOME: codexHome }, + paperclipRuntimeSkills: [keep, remove], + }; + + await runExecutor({ + ...baseConfig, + paperclipSkillSync: { desiredSkills: [keep.key, remove.key] }, + }); + expect(await pathExists(path.join(codexHome, "skills", remove.runtimeName, "SKILL.md"))).toBe(true); + + await runExecutor({ + ...baseConfig, + paperclipSkillSync: { desiredSkills: [keep.key] }, + }); + + expect(await pathExists(path.join(codexHome, "skills", keep.runtimeName, "SKILL.md"))).toBe(true); + expect(await pathExists(path.join(codexHome, "skills", keep.runtimeName, "leak.txt"))).toBe(false); + expect(await pathExists(path.join(codexHome, "skills", keep.runtimeName, "leak-dir"))).toBe(false); + expect(await pathExists(path.join(codexHome, "skills", remove.runtimeName))).toBe(false); + }); + + it.skipIf(process.platform === "win32")("removes legacy ACPX Codex skill symlinks when a skill is no longer desired", async () => { + const root = await makeTempRoot(); + const skillRoot = path.join(root, "skills"); + const codexHome = path.join(root, "codex-home"); + const legacy = await createSkill(skillRoot, "legacy"); + const skillsHome = path.join(codexHome, "skills"); + await fs.mkdir(skillsHome, { recursive: true }); + await fs.symlink(legacy.source, path.join(skillsHome, legacy.runtimeName)); + + await runExecutor({ + agent: "codex", + stateDir: path.join(root, "state"), + env: { CODEX_HOME: codexHome }, + paperclipRuntimeSkills: [legacy], + paperclipSkillSync: { desiredSkills: [] }, + }); + + expect(await pathExists(path.join(skillsHome, legacy.runtimeName))).toBe(false); + }); + + it.skipIf(process.platform === "win32")("replaces stale managed Codex auth files with source symlinks", async () => { + const root = await makeTempRoot(); + const sourceCodexHome = path.join(root, "source-codex-home"); + const paperclipHome = path.join(root, "paperclip-home"); + const managedCodexHome = path.join( + paperclipHome, + "instances", + "default", + "companies", + "company-1", + "codex-home", + ); + await fs.mkdir(sourceCodexHome, { recursive: true }); + await fs.mkdir(managedCodexHome, { recursive: true }); + const sourceAuth = path.join(sourceCodexHome, "auth.json"); + const managedAuth = path.join(managedCodexHome, "auth.json"); + await fs.writeFile(sourceAuth, "{\"source\":true}", "utf8"); + await fs.writeFile(managedAuth, "{\"stale\":true}", "utf8"); + + const previousCodexHome = process.env.CODEX_HOME; + const previousPaperclipHome = process.env.PAPERCLIP_HOME; + try { + process.env.CODEX_HOME = sourceCodexHome; + process.env.PAPERCLIP_HOME = paperclipHome; + await runExecutor({ + agent: "codex", + stateDir: path.join(root, "state"), + paperclipRuntimeSkills: [], + paperclipSkillSync: { desiredSkills: [] }, + }); + } finally { + if (previousCodexHome === undefined) delete process.env.CODEX_HOME; + else process.env.CODEX_HOME = previousCodexHome; + if (previousPaperclipHome === undefined) delete process.env.PAPERCLIP_HOME; + else process.env.PAPERCLIP_HOME = previousPaperclipHome; + } + + const authStat = await fs.lstat(managedAuth); + expect(authStat.isSymbolicLink()).toBe(true); + expect(path.resolve(path.dirname(managedAuth), await fs.readlink(managedAuth))).toBe(sourceAuth); + }); + + it("keeps fresh credential wrapper scripts across ACPX agent changes", async () => { + const root = await makeTempRoot(); + const stateDir = path.join(root, "state"); + const baseConfig = { + agentCommand: "node ./fake-acp.js", + stateDir, + }; + + await runExecutor({ + ...baseConfig, + agent: "custom-a", + env: { PAPERCLIP_API_KEY: "old-key" }, + }); + await runExecutor({ + ...baseConfig, + agent: "custom-b", + env: { PAPERCLIP_API_KEY: "new-key" }, + }); + + const wrappers = await fs.readdir(path.join(stateDir, "wrappers")); + expect(wrappers.filter((name) => name.endsWith(".sh"))).toHaveLength(2); + expect(wrappers.filter((name) => name.endsWith(".env"))).toHaveLength(2); + expect(wrappers.some((name) => name.startsWith("custom-a-"))).toBe(true); + expect(wrappers.some((name) => name.startsWith("custom-b-"))).toBe(true); + const wrapperPath = path.join(stateDir, "wrappers", wrappers.find((name) => name.startsWith("custom-b-") && name.endsWith(".sh"))!); + const envPath = path.join(stateDir, "wrappers", wrappers.find((name) => name.startsWith("custom-b-") && name.endsWith(".env"))!); + const wrapper = await fs.readFile(wrapperPath, "utf8"); + const env = await fs.readFile(envPath, "utf8"); + expect((await fs.stat(envPath)).mode & 0o777).toBe(0o600); + expect((await fs.stat(wrapperPath)).mode & 0o777).toBe(0o700); + expect(wrapper).toContain("node ./fake-acp.js"); + expect(wrapper).not.toContain("PAPERCLIP_API_KEY"); + expect(wrapper).not.toContain("new-key"); + expect(wrapper).not.toContain("old-key"); + expect(env).toContain("PAPERCLIP_API_KEY='new-key'"); + expect(env).not.toContain("old-key"); + }); + + it("cleans aged credential wrapper scripts across ACPX agent changes", async () => { + const root = await makeTempRoot(); + const stateDir = path.join(root, "state"); + const wrappersDir = path.join(stateDir, "wrappers"); + const baseConfig = { + agentCommand: "node ./fake-acp.js", + stateDir, + }; + + await runExecutor({ + ...baseConfig, + agent: "custom-a", + env: { PAPERCLIP_API_KEY: "old-key" }, + }); + const oldDate = new Date(Date.now() - 16 * 60 * 1000); + await Promise.all( + (await fs.readdir(wrappersDir)) + .filter((name) => name.startsWith("custom-a-")) + .map((name) => fs.utimes(path.join(wrappersDir, name), oldDate, oldDate)), + ); + + await runExecutor({ + ...baseConfig, + agent: "custom-b", + env: { PAPERCLIP_API_KEY: "new-key" }, + }); + + const wrappers = await fs.readdir(wrappersDir); + expect(wrappers.filter((name) => name.endsWith(".sh"))).toHaveLength(1); + expect(wrappers.filter((name) => name.endsWith(".env"))).toHaveLength(1); + expect(wrappers.some((name) => name.startsWith("custom-a-"))).toBe(false); + expect(wrappers.some((name) => name.startsWith("custom-b-"))).toBe(true); + }); + + it("keeps distinct wrapper env files for concurrent runs with different credentials", async () => { + const root = await makeTempRoot(); + const stateDir = path.join(root, "state"); + const baseConfig = { + agent: "custom-a", + agentCommand: "node ./fake-acp.js", + stateDir, + }; + + await runExecutor({ + ...baseConfig, + env: { PAPERCLIP_API_KEY: "first-key" }, + }); + await runExecutor({ + ...baseConfig, + env: { PAPERCLIP_API_KEY: "second-key" }, + }); + + const envFileNames = (await fs.readdir(path.join(stateDir, "wrappers"))).filter((name) => name.endsWith(".env")); + expect(envFileNames).toHaveLength(2); + const envFiles = await Promise.all( + envFileNames.map(async (name) => fs.readFile(path.join(stateDir, "wrappers", name), "utf8")), + ); + expect(envFiles.filter((contents) => contents.includes("PAPERCLIP_API_KEY='first-key'"))).toHaveLength(1); + expect(envFiles.filter((contents) => contents.includes("PAPERCLIP_API_KEY='second-key'"))).toHaveLength(1); + }); + + it("passes Paperclip env through the ACP agent wrapper instead of process.env", async () => { + let observedApiKeyDuringStream: string | undefined; + const execute = createAcpxLocalExecutor({ + createRuntime: () => ({ + ensureSession: async () => ({ + backendSessionId: "backend-session", + agentSessionId: "agent-session", + runtimeSessionName: "runtime-session", + }), + startTurn: () => ({ + events: (async function* () { + await Promise.resolve(); + observedApiKeyDuringStream = process.env.PAPERCLIP_API_KEY; + yield { type: "done", stopReason: "end_turn" }; + })(), + result: Promise.resolve({ status: "completed", stopReason: "end_turn" }), + cancel: async () => {}, + }), + close: async () => {}, + }) as never, + }); + + const previousApiKey = process.env.PAPERCLIP_API_KEY; + try { + delete process.env.PAPERCLIP_API_KEY; + const result = await execute({ + runId: "run-1", + agent: { + id: "agent-1", + companyId: "company-1", + }, + runtime: {}, + config: { agent: "custom", agentCommand: "node ./fake-acp.js" }, + context: {}, + authToken: "runtime-key", + onLog: async () => {}, + onMeta: async () => {}, + } as never); + + expect(result.exitCode).toBe(0); + expect(observedApiKeyDuringStream).toBeUndefined(); + } finally { + if (previousApiKey === undefined) delete process.env.PAPERCLIP_API_KEY; + else process.env.PAPERCLIP_API_KEY = previousApiKey; + } + }); +}); diff --git a/packages/adapters/acpx-local/src/server/execute.ts b/packages/adapters/acpx-local/src/server/execute.ts new file mode 100644 index 00000000..6c2840e0 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/execute.ts @@ -0,0 +1,1212 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { createHash, randomUUID } from "node:crypto"; +import { fileURLToPath } from "node:url"; +import type { AdapterExecutionContext, AdapterExecutionResult } from "@paperclipai/adapter-utils"; +import { readAdapterExecutionTarget, adapterExecutionTargetSessionIdentity } from "@paperclipai/adapter-utils/execution-target"; +import { + DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE, + applyPaperclipWorkspaceEnv, + asNumber, + asString, + buildInvocationEnvForLogs, + buildPaperclipEnv, + ensureAbsoluteDirectory, + ensurePathInEnv, + joinPromptSections, + materializePaperclipSkillCopy, + parseObject, + readPaperclipRuntimeSkillEntries, + renderPaperclipWakePrompt, + renderTemplate, + resolvePaperclipDesiredSkillNames, + stringifyPaperclipWakePayload, + type PaperclipSkillEntry, +} from "@paperclipai/adapter-utils/server-utils"; +import { shellQuote } from "@paperclipai/adapter-utils/ssh"; +import { + createAcpRuntime, + createAgentRegistry, + createRuntimeStore, + isAcpRuntimeError, + type AcpAgentRegistry, + type AcpRuntime, + type AcpRuntimeEvent, + type AcpRuntimeHandle, + type AcpRuntimeOptions, + type AcpRuntimeTurn, + type AcpRuntimeTurnResult, +} from "acpx/runtime"; +import { + DEFAULT_ACPX_LOCAL_AGENT, + DEFAULT_ACPX_LOCAL_MODE, + DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS, + DEFAULT_ACPX_LOCAL_PERMISSION_MODE, + DEFAULT_ACPX_LOCAL_TIMEOUT_SEC, +} from "../index.js"; + +const __moduleDir = path.dirname(fileURLToPath(import.meta.url)); +const DEFAULT_WARM_HANDLE_IDLE_MS = 15 * 60 * 1000; +const WRAPPER_CLEANUP_RETENTION_MS = 15 * 60 * 1000; +const PAPERCLIP_MANAGED_CODEX_SKILLS_MANIFEST = ".paperclip-managed-skills.json"; + +type AcpxRuntimeFactory = (options: AcpRuntimeOptions) => AcpRuntime; + +interface RuntimeCacheEntry { + runtime: AcpRuntime; + handle: AcpRuntimeHandle; + fingerprint: string; + lastUsedAt: number; +} + +interface ExecuteDeps { + createRuntime?: AcpxRuntimeFactory; + now?: () => number; + warmHandles?: Map; +} + +interface AcpxPreparedRuntime { + acpxAgent: string; + mode: "persistent" | "oneshot"; + cwd: string; + workspaceId: string; + workspaceRepoUrl: string; + workspaceRepoRef: string; + env: Record; + loggedEnv: Record; + stateDir: string; + permissionMode: "approve-all" | "approve-reads" | "deny-all"; + nonInteractivePermissions: "deny" | "fail"; + timeoutSec: number; + sessionKey: string; + fingerprint: string; + agentCommand: string | null; + agentRegistry: AcpAgentRegistry; + remoteExecutionIdentity: Record | null; + skillPromptInstructions: string; + skillsIdentity: Record; +} + +const defaultWarmHandles = new Map(); + +function stableJson(value: unknown): string { + if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`; + if (value && typeof value === "object") { + return `{${Object.entries(value as Record) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`) + .join(",")}}`; + } + return JSON.stringify(value); +} + +function shortHash(value: unknown): string { + return createHash("sha256").update(stableJson(value)).digest("hex").slice(0, 16); +} + +function defaultPaperclipInstanceDir(): string { + const home = process.env.PAPERCLIP_HOME?.trim() || path.join(os.homedir(), ".paperclip"); + const instanceId = process.env.PAPERCLIP_INSTANCE_ID?.trim() || "default"; + return path.join(home, "instances", instanceId); +} + +function defaultStateDir(companyId: string, agentId: string): string { + return path.join(defaultPaperclipInstanceDir(), "companies", companyId, "acpx-local", "agents", agentId); +} + +function resolveManagedCodexHomeDir(companyId: string): string { + return path.join(defaultPaperclipInstanceDir(), "companies", companyId, "codex-home"); +} + +function packageRootDir(): string { + return path.resolve(__moduleDir, "../.."); +} + +function resolveBuiltInAgentCommand(agent: string): string | null { + const binName = + agent === "claude" + ? "claude-agent-acp" + : agent === "codex" + ? "codex-acp" + : null; + if (!binName) return null; + return path.join(packageRootDir(), "node_modules", ".bin", binName); +} + +function normalizeAgent(config: Record): string { + const agent = asString(config.agent, DEFAULT_ACPX_LOCAL_AGENT).trim(); + return agent || DEFAULT_ACPX_LOCAL_AGENT; +} + +async function pathExists(candidate: string): Promise { + return fs.access(candidate).then(() => true).catch(() => false); +} + +async function ensureParentDir(target: string): Promise { + await fs.mkdir(path.dirname(target), { recursive: true }); +} + +async function writeFileAtomically(input: { + target: string; + contents: string; + mode: number; +}): Promise { + await ensureParentDir(input.target); + const tempPath = `${input.target}.tmp-${process.pid}-${randomUUID()}`; + const handle = await fs.open(tempPath, "wx", input.mode); + try { + await handle.writeFile(input.contents, "utf8"); + await handle.close(); + await fs.rename(tempPath, input.target); + await fs.chmod(input.target, input.mode).catch(() => {}); + } catch (err) { + await handle.close().catch(() => {}); + await fs.rm(tempPath, { force: true }).catch(() => {}); + throw err; + } +} + +async function ensureSymlink(target: string, source: string): Promise { + const resolvedSource = path.resolve(source); + const existing = await fs.lstat(target).catch(() => null); + if (!existing) { + await ensureParentDir(target); + await fs.symlink(resolvedSource, target); + return; + } + + if (!existing.isSymbolicLink()) { + await fs.rm(target, { recursive: true, force: true }); + await fs.symlink(resolvedSource, target); + return; + } + + const linkedPath = await fs.readlink(target).catch(() => null); + if (!linkedPath) return; + + const resolvedLinkedPath = path.resolve(path.dirname(target), linkedPath); + if (resolvedLinkedPath === resolvedSource) return; + + await fs.unlink(target); + await fs.symlink(resolvedSource, target); +} + +async function ensureCopiedFile(target: string, source: string): Promise { + if (await pathExists(target)) return; + await ensureParentDir(target); + await fs.copyFile(source, target); +} + +async function prepareManagedCodexHome(input: { + companyId: string; + sourceHome: string; + targetHome: string; + onLog: AdapterExecutionContext["onLog"]; +}): Promise { + const { sourceHome, targetHome, onLog } = input; + if (path.resolve(sourceHome) === path.resolve(targetHome)) return targetHome; + + await fs.mkdir(targetHome, { recursive: true }); + + const authJson = path.join(sourceHome, "auth.json"); + if (await pathExists(authJson)) await ensureSymlink(path.join(targetHome, "auth.json"), authJson); + + for (const name of ["config.json", "config.toml", "instructions.md"]) { + const source = path.join(sourceHome, name); + if (await pathExists(source)) await ensureCopiedFile(path.join(targetHome, name), source); + } + + await onLog( + "stdout", + `[paperclip] Using Paperclip-managed ACPX Codex home "${targetHome}" (seeded from "${sourceHome}").\n`, + ); + return targetHome; +} + +async function hashPathContents( + candidate: string, + hash: ReturnType, + relativePath: string, + seenDirectories: Set, +): Promise { + const stat = await fs.lstat(candidate); + + if (stat.isSymbolicLink()) { + hash.update(`symlink-skipped:${relativePath}\n`); + return; + } + + if (stat.isDirectory()) { + const realDir = await fs.realpath(candidate).catch(() => candidate); + hash.update(`dir:${relativePath}\n`); + if (seenDirectories.has(realDir)) { + hash.update("loop\n"); + return; + } + seenDirectories.add(realDir); + const entries = await fs.readdir(candidate, { withFileTypes: true }); + entries.sort((left, right) => left.name.localeCompare(right.name)); + for (const entry of entries) { + const childRelativePath = relativePath.length > 0 ? `${relativePath}/${entry.name}` : entry.name; + await hashPathContents(path.join(candidate, entry.name), hash, childRelativePath, seenDirectories); + } + return; + } + + if (stat.isFile()) { + hash.update(`file:${relativePath}\n`); + hash.update(await fs.readFile(candidate)); + hash.update("\n"); + return; + } + + hash.update(`other:${relativePath}:${stat.mode}\n`); +} + +async function buildSkillSetKey(input: { + skills: PaperclipSkillEntry[]; + label: string; +}): Promise { + const hash = createHash("sha256"); + hash.update(`paperclip-acpx-${input.label}-skills:v1\n`); + const sorted = [...input.skills].sort((left, right) => left.runtimeName.localeCompare(right.runtimeName)); + for (const entry of sorted) { + hash.update(`skill:${entry.key}:${entry.runtimeName}\n`); + await hashPathContents(entry.source, hash, entry.runtimeName, new Set()); + } + return hash.digest("hex"); +} + +async function resolveSelectedRuntimeSkills( + config: Record, +): Promise<{ allSkills: PaperclipSkillEntry[]; selectedSkills: PaperclipSkillEntry[]; desiredSkillNames: string[] }> { + const allSkills = await readPaperclipRuntimeSkillEntries(config, __moduleDir); + const desiredSkillNames = resolvePaperclipDesiredSkillNames(config, allSkills); + const desiredSet = new Set(desiredSkillNames); + return { + allSkills, + selectedSkills: allSkills.filter((entry) => desiredSet.has(entry.key)), + desiredSkillNames, + }; +} + +async function prepareClaudeSkillRuntime(input: { + stateDir: string; + config: Record; + onLog: AdapterExecutionContext["onLog"]; +}): Promise<{ + identity: Record; + promptInstructions: string; + commandNotes: string[]; +}> { + const { selectedSkills, desiredSkillNames } = await resolveSelectedRuntimeSkills(input.config); + const skillSetKey = await buildSkillSetKey({ skills: selectedSkills, label: "claude" }); + const bundleRoot = path.join(input.stateDir, "runtime-skills", "claude", skillSetKey); + const skillsHome = path.join(bundleRoot, ".claude", "skills"); + await fs.mkdir(skillsHome, { recursive: true }); + + for (const entry of selectedSkills) { + const target = path.join(skillsHome, entry.runtimeName); + try { + const result = await materializePaperclipSkillCopy(entry.source, target); + if (result.skippedSymlinks.length > 0) { + await input.onLog( + "stdout", + `[paperclip] Materialized ACPX Claude skill "${entry.runtimeName}" into ${skillsHome} and skipped ${result.skippedSymlinks.length} symlink(s).\n`, + ); + } + } catch (err) { + await input.onLog( + "stderr", + `[paperclip] Failed to materialize ACPX Claude skill "${entry.key}" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\n`, + ); + } + } + + const selectedNames = selectedSkills.map((entry) => entry.runtimeName).sort(); + const promptInstructions = selectedSkills.length > 0 + ? [ + "Paperclip has materialized selected runtime skills for this ACPX Claude session.", + `Skill root: ${skillsHome}`, + selectedNames.length > 0 ? `Selected skills: ${selectedNames.join(", ")}` : "", + "When a task calls for one of these skills, read its SKILL.md from that root and follow it.", + ].filter(Boolean).join("\n") + : ""; + + return { + identity: { + mode: "claude", + skillSetKey, + desiredSkillNames, + selectedSkills: selectedNames, + skillRoot: selectedSkills.length > 0 ? skillsHome : null, + }, + promptInstructions, + commandNotes: selectedSkills.length > 0 + ? [`Materialized ${selectedSkills.length} Paperclip skill(s) for ACPX Claude at ${skillsHome}.`] + : [], + }; +} + +async function readManagedCodexSkillsManifest(skillsHome: string): Promise> { + const manifestPath = path.join(skillsHome, PAPERCLIP_MANAGED_CODEX_SKILLS_MANIFEST); + try { + const raw = JSON.parse(await fs.readFile(manifestPath, "utf8")) as unknown; + const parsed = parseObject(raw); + const skills = Array.isArray(parsed.managedSkillNames) + ? parsed.managedSkillNames.filter((value): value is string => typeof value === "string" && value.trim().length > 0) + : []; + return new Set(skills); + } catch { + return new Set(); + } +} + +async function writeManagedCodexSkillsManifest(skillsHome: string, skillNames: Iterable): Promise { + const managedSkillNames = Array.from(new Set(skillNames)).sort(); + await fs.writeFile( + path.join(skillsHome, PAPERCLIP_MANAGED_CODEX_SKILLS_MANIFEST), + `${JSON.stringify({ version: 1, managedSkillNames }, null, 2)}\n`, + "utf8", + ); +} + +async function removeSkillTarget(target: string): Promise { + const existing = await fs.lstat(target).catch(() => null); + if (!existing) return false; + await fs.rm(target, { recursive: true, force: true }); + return true; +} + +async function reconcileManagedCodexSkills(input: { + skillsHome: string; + allSkills: PaperclipSkillEntry[]; + selectedSkills: PaperclipSkillEntry[]; + onLog: AdapterExecutionContext["onLog"]; +}): Promise { + const desired = new Set(input.selectedSkills.map((entry) => entry.runtimeName)); + const managed = await readManagedCodexSkillsManifest(input.skillsHome); + const availableByRuntimeName = new Map(input.allSkills.map((entry) => [entry.runtimeName, entry])); + + for (const name of managed) { + if (desired.has(name)) continue; + if (await removeSkillTarget(path.join(input.skillsHome, name))) { + await input.onLog("stdout", `[paperclip] Revoked ACPX Codex skill "${name}" from ${input.skillsHome}\n`); + } + } + + for (const entry of input.allSkills) { + if (desired.has(entry.runtimeName) || managed.has(entry.runtimeName)) continue; + const target = path.join(input.skillsHome, entry.runtimeName); + const existing = await fs.lstat(target).catch(() => null); + if (!existing?.isSymbolicLink()) continue; + const linkedPath = await fs.readlink(target).catch(() => null); + if (!linkedPath) continue; + const resolvedLinkedPath = path.resolve(path.dirname(target), linkedPath); + if (resolvedLinkedPath !== path.resolve(entry.source)) continue; + if (await removeSkillTarget(target)) { + await input.onLog("stdout", `[paperclip] Revoked legacy ACPX Codex skill "${entry.runtimeName}" from ${input.skillsHome}\n`); + } + } + + for (const name of managed) { + if (desired.has(name) || availableByRuntimeName.has(name)) continue; + if (await removeSkillTarget(path.join(input.skillsHome, name))) { + await input.onLog("stdout", `[paperclip] Revoked unavailable ACPX Codex skill "${name}" from ${input.skillsHome}\n`); + } + } +} + +async function prepareCodexSkillRuntime(input: { + companyId: string; + config: Record; + env: Record; + onLog: AdapterExecutionContext["onLog"]; +}): Promise<{ identity: Record; commandNotes: string[] }> { + const envConfig = parseObject(input.config.env); + const configuredCodexHome = + typeof envConfig.CODEX_HOME === "string" && envConfig.CODEX_HOME.trim().length > 0 + ? path.resolve(envConfig.CODEX_HOME.trim()) + : null; + const sourceCodexHome = + typeof process.env.CODEX_HOME === "string" && process.env.CODEX_HOME.trim().length > 0 + ? path.resolve(process.env.CODEX_HOME.trim()) + : path.join(os.homedir(), ".codex"); + const managedCodexHome = resolveManagedCodexHomeDir(input.companyId); + const effectiveCodexHome = configuredCodexHome ?? + await prepareManagedCodexHome({ + companyId: input.companyId, + sourceHome: sourceCodexHome, + targetHome: managedCodexHome, + onLog: input.onLog, + }); + const { allSkills, selectedSkills, desiredSkillNames } = await resolveSelectedRuntimeSkills(input.config); + const skillSetKey = await buildSkillSetKey({ skills: selectedSkills, label: "codex" }); + const skillsHome = path.join(effectiveCodexHome, "skills"); + await fs.mkdir(skillsHome, { recursive: true }); + await reconcileManagedCodexSkills({ + skillsHome, + allSkills, + selectedSkills, + onLog: input.onLog, + }); + + for (const entry of selectedSkills) { + const target = path.join(skillsHome, entry.runtimeName); + try { + const result = await materializePaperclipSkillCopy(entry.source, target); + if (result.skippedSymlinks.length > 0) { + await input.onLog( + "stdout", + `[paperclip] Materialized ACPX Codex skill "${entry.runtimeName}" into ${skillsHome} and skipped ${result.skippedSymlinks.length} symlink(s).\n`, + ); + } + } catch (err) { + await input.onLog( + "stderr", + `[paperclip] Failed to inject ACPX Codex skill "${entry.key}" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\n`, + ); + } + } + await writeManagedCodexSkillsManifest(skillsHome, selectedSkills.map((entry) => entry.runtimeName)); + + input.env.CODEX_HOME = effectiveCodexHome; + + return { + identity: { + mode: "codex", + skillSetKey, + desiredSkillNames, + selectedSkills: selectedSkills.map((entry) => entry.runtimeName).sort(), + codexHome: effectiveCodexHome, + skillsHome, + }, + commandNotes: [`Prepared ACPX Codex skill home at ${skillsHome}.`], + }; +} + +function normalizeMode(config: Record): "persistent" | "oneshot" { + return asString(config.mode, DEFAULT_ACPX_LOCAL_MODE) === "oneshot" ? "oneshot" : "persistent"; +} + +function normalizePermissionMode(config: Record): "approve-all" | "approve-reads" | "deny-all" { + const value = asString(config.permissionMode, DEFAULT_ACPX_LOCAL_PERMISSION_MODE).trim(); + if (value === "approve-reads" || value === "deny-all") return value; + if (value === "default") return "approve-reads"; + return "approve-all"; +} + +function normalizeNonInteractivePermissions(config: Record): "deny" | "fail" { + return asString(config.nonInteractivePermissions, DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS) === "fail" + ? "fail" + : "deny"; +} + +function isCompatibleSession( + params: Record, + runtime: Pick, +): boolean { + if (asString(params.configFingerprint, "") !== runtime.fingerprint) return false; + if (asString(params.sessionKey, "") !== runtime.sessionKey) return false; + if (asString(params.agent, "") !== runtime.acpxAgent) return false; + if (asString(params.mode, "") !== runtime.mode) return false; + const savedCwd = asString(params.cwd, ""); + if (!savedCwd || path.resolve(savedCwd) !== path.resolve(runtime.cwd)) return false; + const savedRemote = parseObject(params.remoteExecution); + return stableJson(savedRemote) === stableJson(runtime.remoteExecutionIdentity ?? {}); +} + +function buildSessionParams(input: { + prepared: AcpxPreparedRuntime; + handle: AcpRuntimeHandle; +}): Record { + const { prepared, handle } = input; + return { + sessionKey: prepared.sessionKey, + runtimeSessionName: handle.runtimeSessionName, + acpxRecordId: handle.acpxRecordId, + acpSessionId: handle.backendSessionId, + agentSessionId: handle.agentSessionId, + agent: prepared.acpxAgent, + cwd: prepared.cwd, + mode: prepared.mode, + stateDir: prepared.stateDir, + configFingerprint: prepared.fingerprint, + skills: prepared.skillsIdentity, + ...(prepared.workspaceId ? { workspaceId: prepared.workspaceId } : {}), + ...(prepared.workspaceRepoUrl ? { repoUrl: prepared.workspaceRepoUrl } : {}), + ...(prepared.workspaceRepoRef ? { repoRef: prepared.workspaceRepoRef } : {}), + ...(prepared.remoteExecutionIdentity ? { remoteExecution: prepared.remoteExecutionIdentity } : {}), + }; +} + +async function writeAgentWrapper(input: { + stateDir: string; + acpxAgent: string; + agentCommandShell: string; + env: Record; +}): Promise<{ wrapperPath: string; envFilePath: string }> { + const wrappersDir = path.join(input.stateDir, "wrappers"); + await fs.mkdir(wrappersDir, { recursive: true }); + const envLines = Object.entries(input.env) + .filter(([key]) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) + .sort(([left], [right]) => left.localeCompare(right)) + .map(([key, value]) => `${key}=${shellQuote(value)}`); + const wrapperHash = shortHash({ + agent: input.acpxAgent, + command: input.agentCommandShell, + env: envLines, + }); + const wrapperPath = path.join(wrappersDir, `${input.acpxAgent}-${wrapperHash}.sh`); + const envFilePath = path.join(wrappersDir, `${input.acpxAgent}-${wrapperHash}.env`); + const script = [ + "#!/usr/bin/env bash", + "set -euo pipefail", + `env_file=${shellQuote(envFilePath)}`, + "if [[ -f \"$env_file\" ]]; then", + " set -a", + " source \"$env_file\"", + " set +a", + "fi", + `exec ${input.agentCommandShell} "$@"`, + "", + ].join("\n"); + await writeFileAtomically({ + target: envFilePath, + contents: `${envLines.join("\n")}\n`, + mode: 0o600, + }); + await writeFileAtomically({ + target: wrapperPath, + contents: script, + mode: 0o700, + }); + await cleanupStaleAgentWrappers({ + wrappersDir, + currentFileNames: new Set([path.basename(wrapperPath), path.basename(envFilePath)]), + }); + return { wrapperPath, envFilePath }; +} + +async function cleanupStaleAgentWrappers(input: { wrappersDir: string; currentFileNames: Set }) { + const wrappers = await fs.readdir(input.wrappersDir).catch(() => []); + const now = Date.now(); + await Promise.all( + wrappers.map(async (name) => { + const isManagedWrapperFile = name.endsWith(".sh") || name.endsWith(".env"); + if (!isManagedWrapperFile || input.currentFileNames.has(name)) return; + const wrapperPath = path.join(input.wrappersDir, name); + const stats = await fs.stat(wrapperPath).catch(() => null); + if (!stats || now - stats.mtimeMs < WRAPPER_CLEANUP_RETENTION_MS) return; + await fs.rm(wrapperPath, { force: true }); + }), + ); +} + +async function buildRuntime(input: { + ctx: AdapterExecutionContext; +}): Promise { + const { runId, agent, config, context, authToken } = input.ctx; + const workspaceContext = parseObject(context.paperclipWorkspace); + const workspaceCwd = asString(workspaceContext.cwd, ""); + const workspaceSource = asString(workspaceContext.source, ""); + const workspaceStrategy = asString(workspaceContext.strategy, ""); + const workspaceId = asString(workspaceContext.workspaceId, ""); + const workspaceRepoUrl = asString(workspaceContext.repoUrl, ""); + const workspaceRepoRef = asString(workspaceContext.repoRef, ""); + const workspaceBranch = asString(workspaceContext.branchName, ""); + const workspaceWorktreePath = asString(workspaceContext.worktreePath, ""); + const agentHome = asString(workspaceContext.agentHome, ""); + const configuredCwd = asString(config.cwd, ""); + const useConfiguredInsteadOfAgentHome = workspaceSource === "agent_home" && configuredCwd.length > 0; + const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? "" : workspaceCwd; + const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd(); + await ensureAbsoluteDirectory(cwd, { createIfMissing: true }); + + const acpxAgent = normalizeAgent(config); + const mode = normalizeMode(config); + const permissionMode = normalizePermissionMode(config); + const nonInteractivePermissions = normalizeNonInteractivePermissions(config); + const timeoutSec = asNumber(config.timeoutSec, DEFAULT_ACPX_LOCAL_TIMEOUT_SEC); + const stateDir = path.resolve(asString(config.stateDir, "") || defaultStateDir(agent.companyId, agent.id)); + await fs.mkdir(stateDir, { recursive: true }); + + const envConfig = parseObject(config.env); + const hasExplicitApiKey = + typeof envConfig.PAPERCLIP_API_KEY === "string" && envConfig.PAPERCLIP_API_KEY.trim().length > 0; + const env: Record = { ...buildPaperclipEnv(agent), PAPERCLIP_RUN_ID: runId }; + const wakeTaskId = + (typeof context.taskId === "string" && context.taskId.trim()) || + (typeof context.issueId === "string" && context.issueId.trim()) || + ""; + const wakeReason = typeof context.wakeReason === "string" ? context.wakeReason.trim() : ""; + const wakeCommentId = + (typeof context.wakeCommentId === "string" && context.wakeCommentId.trim()) || + (typeof context.commentId === "string" && context.commentId.trim()) || + ""; + const approvalId = typeof context.approvalId === "string" ? context.approvalId.trim() : ""; + const approvalStatus = typeof context.approvalStatus === "string" ? context.approvalStatus.trim() : ""; + const linkedIssueIds = Array.isArray(context.issueIds) + ? context.issueIds.filter((value): value is string => typeof value === "string" && value.trim().length > 0) + : []; + const wakePayloadJson = stringifyPaperclipWakePayload(context.paperclipWake); + if (wakeTaskId) env.PAPERCLIP_TASK_ID = wakeTaskId; + if (wakeReason) env.PAPERCLIP_WAKE_REASON = wakeReason; + if (wakeCommentId) env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId; + if (approvalId) env.PAPERCLIP_APPROVAL_ID = approvalId; + if (approvalStatus) env.PAPERCLIP_APPROVAL_STATUS = approvalStatus; + if (linkedIssueIds.length > 0) env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(","); + if (wakePayloadJson) env.PAPERCLIP_WAKE_PAYLOAD_JSON = wakePayloadJson; + applyPaperclipWorkspaceEnv(env, { + workspaceCwd: effectiveWorkspaceCwd, + workspaceSource, + workspaceStrategy, + workspaceId, + workspaceRepoUrl, + workspaceRepoRef, + workspaceBranch, + workspaceWorktreePath, + agentHome, + }); + for (const [key, value] of Object.entries(envConfig)) { + if (typeof value === "string") env[key] = value; + } + if (!hasExplicitApiKey && authToken) env.PAPERCLIP_API_KEY = authToken; + + let skillPromptInstructions = ""; + let skillsIdentity: Record = { mode: "unsupported" }; + const skillCommandNotes: string[] = []; + if (acpxAgent === "claude") { + const preparedSkills = await prepareClaudeSkillRuntime({ + stateDir, + config, + onLog: input.ctx.onLog, + }); + skillPromptInstructions = preparedSkills.promptInstructions; + skillsIdentity = preparedSkills.identity; + skillCommandNotes.push(...preparedSkills.commandNotes); + } else if (acpxAgent === "codex") { + const preparedSkills = await prepareCodexSkillRuntime({ + companyId: agent.companyId, + config, + env, + onLog: input.ctx.onLog, + }); + skillsIdentity = preparedSkills.identity; + skillCommandNotes.push(...preparedSkills.commandNotes); + } else { + const desired = resolvePaperclipDesiredSkillNames(config, await readPaperclipRuntimeSkillEntries(config, __moduleDir)); + skillsIdentity = { mode: "custom_unsupported", desiredSkillNames: desired }; + if (desired.length > 0) { + skillCommandNotes.push("Selected Paperclip skills are tracked only; ACPX custom commands do not expose a runtime skill contract yet."); + } + } + + const configuredCommand = asString(config.agentCommand, "").trim(); + const builtInCommand = resolveBuiltInAgentCommand(acpxAgent); + const agentCommand = configuredCommand || builtInCommand || null; + const agentCommandShell = configuredCommand || (builtInCommand ? shellQuote(builtInCommand) : ""); + const wrapper = agentCommand + ? await writeAgentWrapper({ + stateDir, + acpxAgent, + agentCommandShell, + env, + }) + : null; + const wrapperPath = wrapper?.wrapperPath ?? null; + const overrides = wrapperPath ? { [acpxAgent]: wrapperPath } : undefined; + const agentRegistry = createAgentRegistry({ overrides }); + const executionTarget = readAdapterExecutionTarget({ + executionTarget: input.ctx.executionTarget, + legacyRemoteExecution: input.ctx.executionTransport?.remoteExecution, + }); + const remoteExecutionIdentity = adapterExecutionTargetSessionIdentity(executionTarget); + const fingerprint = shortHash({ + acpxAgent, + agentCommand: agentCommand ?? acpxAgent, + cwd: path.resolve(cwd), + mode, + permissionMode, + nonInteractivePermissions, + remoteExecutionIdentity, + skillsIdentity, + skillPromptInstructions, + }); + const taskKey = asString(input.ctx.runtime.taskKey, "") || wakeTaskId || workspaceId || "default"; + const sessionKey = `paperclip:${agent.companyId}:${agent.id}:${taskKey}:${fingerprint}`; + const runtimeEnv = ensurePathInEnv({ ...process.env, ...env }); + const loggedEnv = buildInvocationEnvForLogs(env, { + runtimeEnv, + includeRuntimeKeys: ["HOME"], + resolvedCommand: wrapperPath ?? agentCommand ?? acpxAgent, + }); + + return { + acpxAgent, + mode, + cwd, + workspaceId, + workspaceRepoUrl, + workspaceRepoRef, + env, + loggedEnv, + stateDir, + permissionMode, + nonInteractivePermissions, + timeoutSec, + sessionKey, + fingerprint, + agentCommand, + agentRegistry, + remoteExecutionIdentity, + skillPromptInstructions, + skillsIdentity: { + ...skillsIdentity, + commandNotes: skillCommandNotes, + }, + }; +} + +async function buildPrompt(ctx: AdapterExecutionContext, resumedSession: boolean): Promise<{ + prompt: string; + promptMetrics: Record; + commandNotes: string[]; +}> { + const { agent, runId, config, context, onLog } = ctx; + const promptTemplate = asString(config.promptTemplate, DEFAULT_PAPERCLIP_AGENT_PROMPT_TEMPLATE); + const instructionsFilePath = asString(config.instructionsFilePath, "").trim(); + const instructionsDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : ""; + let instructionsPrefix = ""; + const commandNotes: string[] = []; + if (instructionsFilePath) { + try { + const instructionsContents = await fs.readFile(instructionsFilePath, "utf8"); + instructionsPrefix = + `${instructionsContents}\n\n` + + `The above agent instructions were loaded from ${instructionsFilePath}. ` + + `Resolve any relative file references from ${instructionsDir}.\n\n`; + commandNotes.push( + `Loaded agent instructions from ${instructionsFilePath}`, + `Prepended instructions + path directive to the ACPX prompt (relative references from ${instructionsDir}).`, + ); + } catch (err) { + const reason = err instanceof Error ? err.message : String(err); + await onLog( + "stderr", + `[paperclip] Warning: could not read agent instructions file "${instructionsFilePath}": ${reason}\n`, + ); + commandNotes.push(`Configured instructionsFilePath ${instructionsFilePath}, but file could not be read.`); + } + } + + const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, ""); + const templateData = { + agentId: agent.id, + companyId: agent.companyId, + runId, + company: { id: agent.companyId }, + agent, + run: { id: runId, source: "on_demand" }, + context, + }; + const renderedBootstrapPrompt = + !resumedSession && bootstrapPromptTemplate.trim().length > 0 + ? renderTemplate(bootstrapPromptTemplate, templateData).trim() + : ""; + const wakePrompt = renderPaperclipWakePrompt(context.paperclipWake, { resumedSession }); + const shouldUseResumeDeltaPrompt = resumedSession && wakePrompt.length > 0; + const promptInstructionsPrefix = shouldUseResumeDeltaPrompt ? "" : instructionsPrefix; + const renderedPrompt = shouldUseResumeDeltaPrompt ? "" : renderTemplate(promptTemplate, templateData); + const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, "").trim(); + const taskContextNote = asString(context.paperclipTaskMarkdown, "").trim(); + const prompt = joinPromptSections([ + promptInstructionsPrefix, + renderedBootstrapPrompt, + wakePrompt, + sessionHandoffNote, + taskContextNote, + renderedPrompt, + ]); + + return { + prompt, + commandNotes, + promptMetrics: { + promptChars: prompt.length, + instructionsChars: promptInstructionsPrefix.length, + bootstrapPromptChars: renderedBootstrapPrompt.length, + wakePromptChars: wakePrompt.length, + sessionHandoffChars: sessionHandoffNote.length, + taskContextChars: taskContextNote.length, + heartbeatPromptChars: renderedPrompt.length, + }, + }; +} + +async function emitAcpxLog(ctx: AdapterExecutionContext, payload: Record) { + await ctx.onLog("stdout", `${JSON.stringify(payload)}\n`); +} + +async function emitRuntimeEvent(ctx: AdapterExecutionContext, event: AcpRuntimeEvent) { + if (event.type === "text_delta") { + await emitAcpxLog(ctx, { + type: "acpx.text_delta", + text: event.text, + channel: event.stream === "thought" ? "thought" : "output", + tag: event.tag, + }); + return; + } + if (event.type === "tool_call") { + await emitAcpxLog(ctx, { + type: "acpx.tool_call", + name: event.title ?? "acp_tool", + toolCallId: event.toolCallId, + status: event.status, + text: event.text, + tag: event.tag, + }); + return; + } + if (event.type === "status") { + await emitAcpxLog(ctx, { + type: "acpx.status", + text: event.text, + tag: event.tag, + used: event.used, + size: event.size, + }); + return; + } + if (event.type === "done") { + await emitAcpxLog(ctx, { + type: "acpx.result", + summary: event.stopReason ?? "completed", + stopReason: event.stopReason, + }); + return; + } + if (event.type === "error") { + await emitAcpxLog(ctx, { + type: "acpx.error", + message: event.message, + code: event.code, + retryable: event.retryable, + }); + } +} + +function resultErrorMessage(result: AcpRuntimeTurnResult): string | null { + if (result.status !== "failed") return null; + return result.error.message; +} + +function classifyError(err: unknown): Pick { + const message = err instanceof Error ? err.message : String(err); + const maybeCode = + err && typeof err === "object" && typeof (err as { code?: unknown }).code === "string" + ? (err as { code: string }).code + : null; + const acpCode = isAcpRuntimeError(err) || (maybeCode?.startsWith("ACP_") ?? false) ? maybeCode : null; + const lower = message.toLowerCase(); + const authLike = lower.includes("auth") || lower.includes("login") || lower.includes("credential"); + if (authLike) { + return { + errorCode: "acpx_auth_required", + errorMeta: { category: "auth", ...(acpCode ? { acpCode } : {}) }, + }; + } + if (acpCode) { + return { + errorCode: "acpx_protocol_error", + errorMeta: { category: "protocol", acpCode }, + }; + } + return { + errorCode: "acpx_runtime_error", + errorMeta: { category: "runtime" }, + }; +} + +function isResumeFailure(err: unknown): boolean { + const message = err instanceof Error ? err.message : String(err); + return /resume|load|not found|no session|unknown session|conversation/i.test(message); +} + +async function cleanupIdleHandles(input: { + handles: Map; + now: number; + idleMs: number; +}) { + const stale: Array<[string, RuntimeCacheEntry]> = []; + for (const entry of input.handles.entries()) { + if (input.now - entry[1].lastUsedAt >= input.idleMs) stale.push(entry); + } + for (const [key, entry] of stale) { + input.handles.delete(key); + await entry.runtime.close({ + handle: entry.handle, + reason: "paperclip idle cleanup", + discardPersistentState: false, + }).catch(() => {}); + } +} + +function warmHandleMatches( + entry: RuntimeCacheEntry | undefined, + runtime: AcpRuntime, + handle: AcpRuntimeHandle, +): boolean { + return entry?.runtime === runtime && entry.handle === handle; +} + +export function createAcpxLocalExecutor(deps: ExecuteDeps = {}) { + const createRuntime = deps.createRuntime ?? createAcpRuntime; + const now = deps.now ?? (() => Date.now()); + const warmHandles = deps.warmHandles ?? defaultWarmHandles; + + return async function executeAcpxLocal(ctx: AdapterExecutionContext): Promise { + const prepared = await buildRuntime({ ctx }); + const warmIdleMs = asNumber(ctx.config.warmHandleIdleMs, DEFAULT_WARM_HANDLE_IDLE_MS); + await cleanupIdleHandles({ handles: warmHandles, now: now(), idleMs: warmIdleMs }); + + const previousParams = parseObject(ctx.runtime.sessionParams); + const canResume = isCompatibleSession(previousParams, prepared); + const resumeSessionId = canResume ? asString(previousParams.acpSessionId, "") || undefined : undefined; + const cached = canResume ? warmHandles.get(prepared.sessionKey) : undefined; + const runtimeOptions: AcpRuntimeOptions = { + cwd: prepared.cwd, + sessionStore: createRuntimeStore({ stateDir: prepared.stateDir }), + agentRegistry: prepared.agentRegistry, + permissionMode: prepared.permissionMode, + nonInteractivePermissions: prepared.nonInteractivePermissions, + timeoutMs: prepared.timeoutSec > 0 ? prepared.timeoutSec * 1000 : undefined, + }; + const runtime = cached?.runtime ?? createRuntime(runtimeOptions); + if (!canResume && asString(previousParams.runtimeSessionName, "")) { + await ctx.onLog( + "stdout", + `[paperclip] ACPX session "${asString(previousParams.runtimeSessionName, "")}" does not match the current agent/cwd/mode/runtime identity; starting fresh in "${prepared.cwd}".\n`, + ); + } + + let handle = cached?.handle ?? null; + let resumedSession = Boolean(handle ?? resumeSessionId); + let clearSession = false; + + try { + if (!handle) { + try { + handle = await runtime.ensureSession({ + sessionKey: prepared.sessionKey, + agent: prepared.acpxAgent, + mode: prepared.mode, + cwd: prepared.cwd, + resumeSessionId, + }); + } catch (err) { + if (!resumeSessionId || !isResumeFailure(err)) throw err; + clearSession = true; + resumedSession = false; + await ctx.onLog( + "stdout", + `[paperclip] ACPX resume session "${resumeSessionId}" is unavailable; retrying with a fresh session.\n`, + ); + handle = await runtime.ensureSession({ + sessionKey: prepared.sessionKey, + agent: prepared.acpxAgent, + mode: prepared.mode, + cwd: prepared.cwd, + }); + } + } + } catch (err) { + const classified = classifyError(err); + const message = err instanceof Error ? err.message : String(err); + await emitAcpxLog(ctx, { type: "acpx.error", message, ...classified.errorMeta }); + return { + exitCode: 1, + signal: null, + timedOut: false, + errorMessage: message, + ...classified, + provider: "acpx", + model: null, + clearSession, + resultJson: { phase: "ensure_session" }, + summary: message, + }; + } + + if (!handle) { + return { + exitCode: 1, + signal: null, + timedOut: false, + errorMessage: "ACPX did not return a runtime session handle.", + errorCode: "acpx_runtime_error", + provider: "acpx", + model: null, + resultJson: { phase: "ensure_session" }, + summary: "ACPX did not return a runtime session handle.", + }; + } + const sessionHandle = handle; + const { prompt, promptMetrics, commandNotes } = await buildPrompt(ctx, resumedSession); + const runPrompt = joinPromptSections([prepared.skillPromptInstructions, prompt]); + await emitAcpxLog(ctx, { + type: "acpx.session", + agent: prepared.acpxAgent, + sessionId: sessionHandle.backendSessionId, + acpSessionId: sessionHandle.backendSessionId, + agentSessionId: sessionHandle.agentSessionId, + runtimeSessionName: sessionHandle.runtimeSessionName, + mode: prepared.mode, + permissionMode: prepared.permissionMode, + }); + if (ctx.onMeta) { + await ctx.onMeta({ + adapterType: "acpx_local", + command: prepared.agentCommand ?? prepared.acpxAgent, + cwd: prepared.cwd, + commandNotes: [ + `ACPX runtime embedded in Paperclip with ${prepared.mode} session mode.`, + `Effective ACPX permission mode: ${prepared.permissionMode}.`, + ...(Array.isArray(prepared.skillsIdentity.commandNotes) + ? prepared.skillsIdentity.commandNotes.filter((note): note is string => typeof note === "string") + : []), + ...commandNotes, + ], + env: prepared.loggedEnv, + prompt: runPrompt, + promptMetrics, + context: ctx.context, + }); + } + + let cancelActiveTurn: ((reason: string) => Promise) | null = null; + let controller: AbortController | null = null; + let timeout: NodeJS.Timeout | null = null; + let timedOut = false; + const textParts: string[] = []; + try { + const timeoutMs = prepared.timeoutSec > 0 ? prepared.timeoutSec * 1000 : undefined; + controller = new AbortController(); + if (timeoutMs) { + timeout = setTimeout(() => { + timedOut = true; + controller?.abort(); + void cancelActiveTurn?.(`Timed out after ${prepared.timeoutSec}s`).catch(() => {}); + }, timeoutMs); + } + const turn = runtime.startTurn({ + handle: sessionHandle, + text: runPrompt, + mode: "prompt", + requestId: ctx.runId, + timeoutMs, + signal: controller?.signal, + }); + cancelActiveTurn = async (reason: string) => { + await turn.cancel({ reason }); + }; + for await (const event of turn.events) { + if (event.type === "text_delta") textParts.push(event.text); + await emitRuntimeEvent(ctx, event); + } + const terminal = await turn.result; + if (timeout) clearTimeout(timeout); + if (terminal.status === "failed" || terminal.status === "cancelled" || timedOut) { + if (warmHandleMatches(warmHandles.get(prepared.sessionKey), runtime, sessionHandle)) { + warmHandles.delete(prepared.sessionKey); + } + await runtime.close({ + handle: sessionHandle, + reason: timedOut ? "paperclip timeout cleanup" : `paperclip turn ${terminal.status}`, + discardPersistentState: terminal.status === "cancelled" || timedOut, + }).catch(() => {}); + } else if (prepared.mode === "persistent") { + const existing = warmHandles.get(prepared.sessionKey); + if (existing && !warmHandleMatches(existing, runtime, sessionHandle)) { + await runtime.close({ + handle: sessionHandle, + reason: "paperclip duplicate warm handle cleanup", + discardPersistentState: false, + }).catch(() => {}); + } else { + warmHandles.set(prepared.sessionKey, { + runtime, + handle: sessionHandle, + fingerprint: prepared.fingerprint, + lastUsedAt: now(), + }); + } + } + + const errorMessage = timedOut + ? `Timed out after ${prepared.timeoutSec}s` + : resultErrorMessage(terminal); + const terminalStopReason = terminal.status === "failed" ? terminal.error.message : terminal.stopReason; + await emitAcpxLog(ctx, { + type: terminal.status === "completed" ? "acpx.result" : "acpx.error", + summary: terminal.status, + stopReason: terminalStopReason, + message: errorMessage, + }); + return { + exitCode: terminal.status === "completed" ? 0 : 1, + signal: timedOut ? "SIGTERM" : null, + timedOut, + errorMessage, + errorCode: terminal.status === "failed" ? "acpx_turn_failed" : timedOut ? "acpx_timeout" : null, + sessionId: sessionHandle.backendSessionId ?? sessionHandle.runtimeSessionName, + sessionParams: buildSessionParams({ prepared, handle: sessionHandle }), + sessionDisplayId: sessionHandle.agentSessionId ?? sessionHandle.backendSessionId ?? sessionHandle.runtimeSessionName, + provider: "acpx", + model: null, + billingType: "unknown", + costUsd: null, + resultJson: { + status: terminal.status, + stopReason: terminalStopReason, + permissionMode: prepared.permissionMode, + mode: prepared.mode, + }, + summary: textParts.join("").trim() || terminalStopReason || terminal.status, + clearSession, + }; + } catch (err) { + if (timeout) clearTimeout(timeout); + const classified = classifyError(err); + const message = timedOut ? `Timed out after ${prepared.timeoutSec}s` : err instanceof Error ? err.message : String(err); + const cancel = cancelActiveTurn as ((reason: string) => Promise) | null; + if (cancel) await cancel(message).catch(() => {}); + await runtime.close({ + handle: sessionHandle, + reason: timedOut ? "paperclip timeout cleanup" : "paperclip error cleanup", + discardPersistentState: timedOut, + }).catch(() => {}); + if (warmHandleMatches(warmHandles.get(prepared.sessionKey), runtime, sessionHandle)) { + warmHandles.delete(prepared.sessionKey); + } + await emitAcpxLog(ctx, { type: "acpx.error", message, ...classified.errorMeta }); + return { + exitCode: 1, + signal: timedOut ? "SIGTERM" : null, + timedOut, + errorMessage: message, + errorCode: timedOut ? "acpx_timeout" : classified.errorCode, + errorMeta: classified.errorMeta, + provider: "acpx", + model: null, + clearSession: clearSession || timedOut, + resultJson: { phase: "turn" }, + summary: message, + }; + } + }; +} + +export const execute = createAcpxLocalExecutor(); diff --git a/packages/adapters/acpx-local/src/server/index.ts b/packages/adapters/acpx-local/src/server/index.ts new file mode 100644 index 00000000..7463c952 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/index.ts @@ -0,0 +1,5 @@ +export { execute, createAcpxLocalExecutor } from "./execute.js"; +export { testEnvironment } from "./test.js"; +export { getConfigSchema } from "./config-schema.js"; +export { sessionCodec } from "./session-codec.js"; +export { listAcpxSkills, syncAcpxSkills } from "./skills.js"; diff --git a/packages/adapters/acpx-local/src/server/session-codec.ts b/packages/adapters/acpx-local/src/server/session-codec.ts new file mode 100644 index 00000000..2045adcd --- /dev/null +++ b/packages/adapters/acpx-local/src/server/session-codec.ts @@ -0,0 +1,50 @@ +import type { AdapterSessionCodec } from "@paperclipai/adapter-utils"; + +function readString(value: unknown): string | null { + return typeof value === "string" && value.trim().length > 0 ? value.trim() : null; +} + +function readRecord(value: unknown): Record | null { + return typeof value === "object" && value !== null && !Array.isArray(value) ? { ...(value as Record) } : null; +} + +export const sessionCodec: AdapterSessionCodec = { + deserialize(raw: unknown) { + if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null; + const record = raw as Record; + const runtimeSessionName = readString(record.runtimeSessionName); + const acpSessionId = readString(record.acpSessionId); + const agentSessionId = readString(record.agentSessionId); + const remoteExecution = readRecord(record.remoteExecution); + if (!runtimeSessionName && !acpSessionId && !agentSessionId) return null; + + return { + ...(runtimeSessionName ? { runtimeSessionName } : {}), + ...(readString(record.sessionKey) ? { sessionKey: readString(record.sessionKey) } : {}), + ...(readString(record.acpxRecordId) ? { acpxRecordId: readString(record.acpxRecordId) } : {}), + ...(acpSessionId ? { acpSessionId } : {}), + ...(agentSessionId ? { agentSessionId } : {}), + ...(readString(record.agent) ? { agent: readString(record.agent) } : {}), + ...(readString(record.cwd) ? { cwd: readString(record.cwd) } : {}), + ...(readString(record.mode) ? { mode: readString(record.mode) } : {}), + ...(readString(record.stateDir) ? { stateDir: readString(record.stateDir) } : {}), + ...(readString(record.configFingerprint) ? { configFingerprint: readString(record.configFingerprint) } : {}), + ...(readString(record.workspaceId) ? { workspaceId: readString(record.workspaceId) } : {}), + ...(readString(record.repoUrl) ? { repoUrl: readString(record.repoUrl) } : {}), + ...(readString(record.repoRef) ? { repoRef: readString(record.repoRef) } : {}), + ...(remoteExecution ? { remoteExecution } : {}), + }; + }, + serialize(params: Record | null) { + if (!params) return null; + return this.deserialize(params); + }, + getDisplayId(params: Record | null) { + if (!params) return null; + return ( + readString(params.runtimeSessionName) ?? + readString(params.acpSessionId) ?? + readString(params.agentSessionId) + ); + }, +}; diff --git a/packages/adapters/acpx-local/src/server/skills.ts b/packages/adapters/acpx-local/src/server/skills.ts new file mode 100644 index 00000000..16065b36 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/skills.ts @@ -0,0 +1,106 @@ +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import type { + AdapterSkillContext, + AdapterSkillEntry, + AdapterSkillSnapshot, +} from "@paperclipai/adapter-utils"; +import { + readPaperclipRuntimeSkillEntries, + resolvePaperclipDesiredSkillNames, +} from "@paperclipai/adapter-utils/server-utils"; + +const __moduleDir = path.dirname(fileURLToPath(import.meta.url)); + +type AcpxSkillAgent = "claude" | "codex" | "custom"; + +function normalizeAcpxSkillAgent(config: Record): AcpxSkillAgent { + const configured = typeof config.agent === "string" ? config.agent.trim() : ""; + if (configured === "codex" || configured === "custom") return configured; + if (configured === "claude" || configured === "") return "claude"; + return "claude"; +} + +function configuredDetail(agent: AcpxSkillAgent): string { + if (agent === "codex") { + return "Will be linked into the effective CODEX_HOME/skills/ directory for the next ACPX Codex session."; + } + return "Will be mounted into the next ACPX Claude session."; +} + +function unsupportedDetail(): string { + return "Desired state is stored in Paperclip only; custom ACP commands need an explicit skill integration contract before runtime sync is available."; +} + +async function buildAcpxSkillSnapshot(config: Record): Promise { + const acpxAgent = normalizeAcpxSkillAgent(config); + const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir); + const availableByKey = new Map(availableEntries.map((entry) => [entry.key, entry])); + const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries); + const desiredSet = new Set(desiredSkills); + const supported = acpxAgent !== "custom"; + const warnings: string[] = supported + ? [] + : [ + "Custom ACP commands do not expose a Paperclip skill integration contract yet; selected skills are tracked only.", + ]; + + const entries: AdapterSkillEntry[] = availableEntries.map((entry) => { + const desired = desiredSet.has(entry.key); + return { + key: entry.key, + runtimeName: entry.runtimeName, + desired, + managed: true, + state: desired ? "configured" : "available", + origin: entry.required ? "paperclip_required" : "company_managed", + originLabel: entry.required ? "Required by Paperclip" : "Managed by Paperclip", + readOnly: false, + sourcePath: entry.source, + targetPath: null, + detail: desired ? (supported ? configuredDetail(acpxAgent) : unsupportedDetail()) : null, + required: Boolean(entry.required), + requiredReason: entry.requiredReason ?? null, + }; + }); + + for (const desiredSkill of desiredSkills) { + if (availableByKey.has(desiredSkill)) continue; + warnings.push(`Desired skill "${desiredSkill}" is not available from the Paperclip skills directory.`); + entries.push({ + key: desiredSkill, + runtimeName: null, + desired: true, + managed: true, + state: "missing", + origin: "external_unknown", + originLabel: "External or unavailable", + readOnly: false, + sourcePath: null, + targetPath: null, + detail: "Paperclip cannot find this skill in the local runtime skills directory.", + }); + } + + entries.sort((left, right) => left.key.localeCompare(right.key)); + + return { + adapterType: "acpx_local", + supported, + mode: supported ? "ephemeral" : "unsupported", + desiredSkills, + entries, + warnings, + }; +} + +export async function listAcpxSkills(ctx: AdapterSkillContext): Promise { + return buildAcpxSkillSnapshot(ctx.config); +} + +export async function syncAcpxSkills( + ctx: AdapterSkillContext, + _desiredSkills: string[], +): Promise { + return buildAcpxSkillSnapshot(ctx.config); +} diff --git a/packages/adapters/acpx-local/src/server/test.test.ts b/packages/adapters/acpx-local/src/server/test.test.ts new file mode 100644 index 00000000..f5744f54 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/test.test.ts @@ -0,0 +1,49 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { testEnvironment } from "./test.js"; + +const originalNodeVersion = process.version; + +function setNodeVersion(version: string): void { + Object.defineProperty(process, "version", { + configurable: true, + enumerable: true, + value: version, + }); +} + +afterEach(() => { + setNodeVersion(originalNodeVersion); +}); + +describe("acpx_local environment diagnostics", () => { + it("does not force healthy default Claude diagnostics to warn", async () => { + setNodeVersion("v22.12.0"); + + const result = await testEnvironment({ + adapterType: "acpx_local", + companyId: "test-company", + config: { agent: "claude" }, + }); + + expect(result.status).toBe("pass"); + expect(result.checks).toContainEqual( + expect.objectContaining({ + code: "acpx_agent_selected", + level: "info", + message: "ACP agent selected: claude", + }), + ); + expect(result.checks).toContainEqual( + expect.objectContaining({ + code: "acpx_runtime_scaffold", + level: "info", + }), + ); + expect(result.checks).not.toContainEqual( + expect.objectContaining({ + code: "acpx_runtime_scaffold", + level: "warn", + }), + ); + }); +}); diff --git a/packages/adapters/acpx-local/src/server/test.ts b/packages/adapters/acpx-local/src/server/test.ts new file mode 100644 index 00000000..f19304e8 --- /dev/null +++ b/packages/adapters/acpx-local/src/server/test.ts @@ -0,0 +1,295 @@ +import { createRequire } from "node:module"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import type { + AdapterEnvironmentCheck, + AdapterEnvironmentTestContext, + AdapterEnvironmentTestResult, +} from "@paperclipai/adapter-utils"; +import { + asString, + parseObject, +} from "@paperclipai/adapter-utils/server-utils"; + +const require = createRequire(import.meta.url); +const MIN_NODE_MAJOR = 22; +const MIN_NODE_MINOR = 12; +const MIN_NODE_PATCH = 0; + +function summarizeStatus(checks: AdapterEnvironmentCheck[]): AdapterEnvironmentTestResult["status"] { + if (checks.some((check) => check.level === "error")) return "fail"; + if (checks.some((check) => check.level === "warn")) return "warn"; + return "pass"; +} + +function nodeVersionMeetsMinimum(version: string): boolean { + const [major = 0, minor = 0, patch = 0] = version + .replace(/^v/, "") + .split(".") + .map((part) => Number.parseInt(part, 10)); + if (major > MIN_NODE_MAJOR) return true; + if (major < MIN_NODE_MAJOR) return false; + if (minor > MIN_NODE_MINOR) return true; + if (minor < MIN_NODE_MINOR) return false; + return patch >= MIN_NODE_PATCH; +} + +function isNonEmpty(value: unknown): value is string { + return typeof value === "string" && value.trim().length > 0; +} + +function getStringEnv(configEnv: Record, key: string): string | undefined { + const configured = configEnv[key]; + if (typeof configured === "string") return configured; + return process.env[key]; +} + +function credentialSource(configEnv: Record, key: string): string { + return typeof configEnv[key] === "string" ? "adapter config env" : "server environment"; +} + +async function readJsonObject(filePath: string): Promise | null> { + try { + const parsed = JSON.parse(await fs.readFile(filePath, "utf8")) as unknown; + return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) + ? parsed as Record + : null; + } catch { + return null; + } +} + +function readNestedString(record: Record, pathSegments: string[]): string | null { + let current: unknown = record; + for (const segment of pathSegments) { + if (typeof current !== "object" || current === null || Array.isArray(current)) return null; + current = (current as Record)[segment]; + } + return isNonEmpty(current) ? current.trim() : null; +} + +async function hasClaudeSubscriptionCredentials(configDir: string): Promise { + for (const filename of [".credentials.json", "credentials.json"]) { + const credentials = await readJsonObject(path.join(configDir, filename)); + if (!credentials) continue; + if (readNestedString(credentials, ["claudeAiOauth", "accessToken"])) return true; + } + return false; +} + +async function hasCodexNativeCredentials(codexHome: string): Promise { + const auth = await readJsonObject(path.join(codexHome, "auth.json")); + if (!auth) return false; + return Boolean( + readNestedString(auth, ["accessToken"]) || + readNestedString(auth, ["tokens", "access_token"]) || + readNestedString(auth, ["OPENAI_API_KEY"]), + ); +} + +async function buildCredentialHintChecks( + agent: string, + configEnv: Record, +): Promise { + if (agent === "claude") { + const bedrockFlag = getStringEnv(configEnv, "CLAUDE_CODE_USE_BEDROCK"); + const bedrockBaseUrl = getStringEnv(configEnv, "ANTHROPIC_BEDROCK_BASE_URL"); + const hasBedrock = + bedrockFlag === "1" || + /^true$/i.test(bedrockFlag ?? "") || + isNonEmpty(bedrockBaseUrl); + const bedrockSourceKey = isNonEmpty(bedrockFlag) + ? "CLAUDE_CODE_USE_BEDROCK" + : "ANTHROPIC_BEDROCK_BASE_URL"; + const anthropicApiKey = getStringEnv(configEnv, "ANTHROPIC_API_KEY"); + const claudeConfigDir = isNonEmpty(getStringEnv(configEnv, "CLAUDE_CONFIG_DIR")) + ? path.resolve(getStringEnv(configEnv, "CLAUDE_CONFIG_DIR") as string) + : path.join(os.homedir(), ".claude"); + + if (hasBedrock) { + return [{ + code: "acpx_claude_bedrock_auth_detected", + level: "info", + message: "Claude credential hint: Bedrock auth indicators are configured.", + detail: `Detected in ${credentialSource(configEnv, bedrockSourceKey)}.`, + hint: "Ensure AWS credentials and AWS_REGION are available to the ACPX-launched Claude agent.", + }]; + } + + if (isNonEmpty(anthropicApiKey)) { + return [{ + code: "acpx_claude_anthropic_api_key_detected", + level: "info", + message: "Claude credential hint: ANTHROPIC_API_KEY is set.", + detail: `Detected in ${credentialSource(configEnv, "ANTHROPIC_API_KEY")}.`, + }]; + } + + if (await hasClaudeSubscriptionCredentials(claudeConfigDir)) { + return [{ + code: "acpx_claude_subscription_auth_detected", + level: "info", + message: "Claude credential hint: local Claude subscription credentials were found.", + detail: `Credentials found in ${claudeConfigDir}.`, + }]; + } + + return [{ + code: "acpx_claude_credentials_missing", + level: "info", + message: "Claude credential hint: no Claude API, Bedrock, or local subscription credentials were detected.", + hint: "Set ANTHROPIC_API_KEY, configure Bedrock, or run `claude login` before starting an ACPX Claude agent.", + }]; + } + + if (agent === "codex") { + const openAiApiKey = getStringEnv(configEnv, "OPENAI_API_KEY"); + const codexHome = isNonEmpty(getStringEnv(configEnv, "CODEX_HOME")) + ? path.resolve(getStringEnv(configEnv, "CODEX_HOME") as string) + : path.join(os.homedir(), ".codex"); + + if (isNonEmpty(openAiApiKey)) { + return [{ + code: "acpx_codex_openai_api_key_detected", + level: "info", + message: "Codex credential hint: OPENAI_API_KEY is set.", + detail: `Detected in ${credentialSource(configEnv, "OPENAI_API_KEY")}.`, + }]; + } + + if (await hasCodexNativeCredentials(codexHome)) { + return [{ + code: "acpx_codex_native_auth_detected", + level: "info", + message: "Codex credential hint: local Codex auth configuration was found.", + detail: `Credentials found in ${path.join(codexHome, "auth.json")}.`, + }]; + } + + return [{ + code: "acpx_codex_credentials_missing", + level: "info", + message: "Codex credential hint: no OpenAI API key or local Codex auth configuration was detected.", + hint: "Set OPENAI_API_KEY or run `codex login` before starting an ACPX Codex agent.", + }]; + } + + return []; +} + +function resolvePackage(name: string): AdapterEnvironmentCheck { + try { + const resolved = require.resolve(`${name}/package.json`); + return { + code: `acpx_package_${name.replace(/[^a-z0-9]+/gi, "_").toLowerCase()}_present`, + level: "info", + message: `${name} is resolvable.`, + detail: resolved, + }; + } catch { + return { + code: `acpx_package_${name.replace(/[^a-z0-9]+/gi, "_").toLowerCase()}_missing`, + level: "error", + message: `${name} is not resolvable from the acpx_local adapter package.`, + hint: "Run pnpm install so the ACPX adapter dependencies are installed.", + }; + } +} + +async function checkDirectory(pathValue: string, code: string, label: string): Promise { + const dir = pathValue.trim(); + if (!dir) return null; + try { + await fs.mkdir(dir, { recursive: true }); + await fs.access(dir); + return { + code, + level: "info", + message: `${label} is writable: ${dir}`, + }; + } catch (err) { + return { + code: `${code}_invalid`, + level: "error", + message: err instanceof Error ? err.message : `${label} is not writable.`, + detail: dir, + }; + } +} + +export async function testEnvironment( + ctx: AdapterEnvironmentTestContext, +): Promise { + const config = parseObject(ctx.config); + const envConfig = parseObject(config.env); + const configEnv: Record = {}; + for (const [key, value] of Object.entries(envConfig)) { + if (typeof value === "string") configEnv[key] = value; + } + const checks: AdapterEnvironmentCheck[] = []; + const nodeVersion = process.version; + + checks.push({ + code: nodeVersionMeetsMinimum(nodeVersion) ? "acpx_node_supported" : "acpx_node_unsupported", + level: nodeVersionMeetsMinimum(nodeVersion) ? "info" : "error", + message: nodeVersionMeetsMinimum(nodeVersion) + ? `Node ${nodeVersion} satisfies ACPX's >=22.12.0 requirement.` + : `Node ${nodeVersion} does not satisfy ACPX's >=22.12.0 requirement.`, + hint: nodeVersionMeetsMinimum(nodeVersion) + ? undefined + : "Run acpx_local agents with Node >=22.12.0 or use claude_local/codex_local on Node 20.", + }); + + checks.push(resolvePackage("acpx")); + checks.push(resolvePackage("@agentclientprotocol/claude-agent-acp")); + checks.push(resolvePackage("@zed-industries/codex-acp")); + + const agent = asString(config.agent, "claude"); + if (!["claude", "codex", "custom"].includes(agent)) { + checks.push({ + code: "acpx_agent_invalid", + level: "error", + message: `Unsupported ACP agent: ${agent}`, + hint: "Use agent=claude, agent=codex, or agent=custom.", + }); + } else { + checks.push({ + code: "acpx_agent_selected", + level: "info", + message: `ACP agent selected: ${agent}`, + }); + checks.push(...await buildCredentialHintChecks(agent, configEnv)); + } + + if (agent === "custom" && !asString(config.agentCommand, "")) { + checks.push({ + code: "acpx_custom_command_missing", + level: "error", + message: "agentCommand is required when agent=custom.", + }); + } + + const stateDirCheck = await checkDirectory(asString(config.stateDir, ""), "acpx_state_dir_writable", "ACPX state directory"); + if (stateDirCheck) checks.push(stateDirCheck); + + const permissionMode = asString(config.permissionMode, "approve-all"); + checks.push({ + code: "acpx_permission_mode", + level: "info", + message: `Effective permission mode: ${permissionMode || "approve-all"}`, + }); + + checks.push({ + code: "acpx_runtime_scaffold", + level: "info", + message: "acpx_local runtime execution is available through the bundled ACPX runtime.", + }); + + return { + adapterType: ctx.adapterType, + status: summarizeStatus(checks), + checks, + testedAt: new Date().toISOString(), + }; +} diff --git a/packages/adapters/acpx-local/src/ui/build-config.ts b/packages/adapters/acpx-local/src/ui/build-config.ts new file mode 100644 index 00000000..445686dc --- /dev/null +++ b/packages/adapters/acpx-local/src/ui/build-config.ts @@ -0,0 +1,139 @@ +import type { CreateConfigValues } from "@paperclipai/adapter-utils"; +import { + DEFAULT_ACPX_LOCAL_AGENT, + DEFAULT_ACPX_LOCAL_MODE, + DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS, + DEFAULT_ACPX_LOCAL_PERMISSION_MODE, + DEFAULT_ACPX_LOCAL_TIMEOUT_SEC, +} from "../index.js"; + +function parseCommaArgs(value: string): string[] { + return value + .split(",") + .map((item) => item.trim()) + .filter(Boolean); +} + +function parseEnvVars(text: string): Record { + const env: Record = {}; + for (const line of text.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq <= 0) continue; + const key = trimmed.slice(0, eq).trim(); + const value = trimmed.slice(eq + 1); + if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) continue; + env[key] = value; + } + return env; +} + +function parseEnvBindings(bindings: unknown): Record { + if (typeof bindings !== "object" || bindings === null || Array.isArray(bindings)) return {}; + const env: Record = {}; + for (const [key, raw] of Object.entries(bindings)) { + if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) continue; + if (typeof raw === "string") { + env[key] = { type: "plain", value: raw }; + continue; + } + if (typeof raw !== "object" || raw === null || Array.isArray(raw)) continue; + const rec = raw as Record; + if (rec.type === "plain" && typeof rec.value === "string") { + env[key] = { type: "plain", value: rec.value }; + continue; + } + if (rec.type === "secret_ref" && typeof rec.secretId === "string") { + env[key] = { + type: "secret_ref", + secretId: rec.secretId, + ...(typeof rec.version === "number" || rec.version === "latest" + ? { version: rec.version } + : {}), + }; + } + } + return env; +} + +function parseJsonObject(text: string): Record | null { + const trimmed = text.trim(); + if (!trimmed) return null; + try { + const parsed = JSON.parse(trimmed); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null; + return parsed as Record; + } catch { + return null; + } +} + +function readNumber(value: unknown, fallback: number): number { + if (typeof value === "number" && Number.isFinite(value)) return value; + if (typeof value === "string" && value.trim()) { + const parsed = Number(value); + if (Number.isFinite(parsed)) return parsed; + } + return fallback; +} + +export function buildAcpxLocalConfig(v: CreateConfigValues): Record { + const schemaValues = v.adapterSchemaValues ?? {}; + const ac: Record = { + agent: schemaValues.agent || DEFAULT_ACPX_LOCAL_AGENT, + mode: schemaValues.mode || DEFAULT_ACPX_LOCAL_MODE, + permissionMode: schemaValues.permissionMode || DEFAULT_ACPX_LOCAL_PERMISSION_MODE, + nonInteractivePermissions: + schemaValues.nonInteractivePermissions || DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS, + timeoutSec: readNumber(schemaValues.timeoutSec, DEFAULT_ACPX_LOCAL_TIMEOUT_SEC), + }; + + for (const key of [ + "agentCommand", + "cwd", + "stateDir", + "instructionsFilePath", + "promptTemplate", + "bootstrapPromptTemplate", + ]) { + const value = schemaValues[key]; + if (typeof value === "string" && value.trim()) ac[key] = value.trim(); + } + + if (!ac.cwd && v.cwd) ac.cwd = v.cwd; + if (!ac.instructionsFilePath && v.instructionsFilePath) ac.instructionsFilePath = v.instructionsFilePath; + if (!ac.promptTemplate && v.promptTemplate) ac.promptTemplate = v.promptTemplate; + if (!ac.bootstrapPromptTemplate && v.bootstrapPrompt) ac.bootstrapPromptTemplate = v.bootstrapPrompt; + + const env = parseEnvBindings(v.envBindings); + const legacy = parseEnvVars(v.envVars); + for (const [key, value] of Object.entries(legacy)) { + if (!Object.prototype.hasOwnProperty.call(env, key)) { + env[key] = { type: "plain", value }; + } + } + if (typeof schemaValues.env === "string") { + const schemaEnv = parseJsonObject(schemaValues.env); + if (schemaEnv) Object.assign(env, schemaEnv); + } else if (typeof schemaValues.env === "object" && schemaValues.env !== null && !Array.isArray(schemaValues.env)) { + Object.assign(env, schemaValues.env as Record); + } + if (Object.keys(env).length > 0) ac.env = env; + + if (v.workspaceStrategyType === "git_worktree") { + ac.workspaceStrategy = { + type: "git_worktree", + ...(v.workspaceBaseRef ? { baseRef: v.workspaceBaseRef } : {}), + ...(v.workspaceBranchTemplate ? { branchTemplate: v.workspaceBranchTemplate } : {}), + ...(v.worktreeParentDir ? { worktreeParentDir: v.worktreeParentDir } : {}), + }; + } + const runtimeServices = parseJsonObject(v.runtimeServicesJson ?? ""); + if (runtimeServices && Array.isArray(runtimeServices.services)) { + ac.workspaceRuntime = runtimeServices; + } + if (v.command) ac.command = v.command; + if (v.extraArgs) ac.extraArgs = parseCommaArgs(v.extraArgs); + return ac; +} diff --git a/packages/adapters/acpx-local/src/ui/index.ts b/packages/adapters/acpx-local/src/ui/index.ts new file mode 100644 index 00000000..629baaad --- /dev/null +++ b/packages/adapters/acpx-local/src/ui/index.ts @@ -0,0 +1,2 @@ +export { parseAcpxStdoutLine } from "./parse-stdout.js"; +export { buildAcpxLocalConfig } from "./build-config.js"; diff --git a/packages/adapters/acpx-local/src/ui/parse-stdout.test.ts b/packages/adapters/acpx-local/src/ui/parse-stdout.test.ts new file mode 100644 index 00000000..80fb2671 --- /dev/null +++ b/packages/adapters/acpx-local/src/ui/parse-stdout.test.ts @@ -0,0 +1,160 @@ +import { describe, expect, it } from "vitest"; +import { parseAcpxStdoutLine } from "./parse-stdout.js"; + +const TS = "2026-04-30T00:00:00.000Z"; + +function emit(payload: Record): string { + return JSON.stringify(payload); +} + +describe("parseAcpxStdoutLine", () => { + it("renders an init entry from acpx.session", () => { + const entries = parseAcpxStdoutLine( + emit({ + type: "acpx.session", + agent: "claude", + acpSessionId: "acp-1", + runtimeSessionName: "runtime-1", + mode: "persistent", + permissionMode: "approve-all", + }), + TS, + ); + expect(entries).toEqual([ + { + kind: "init", + ts: TS, + model: "claude (persistent / approve-all)", + sessionId: "acp-1", + }, + ]); + }); + + it("routes output text_delta to the assistant transcript", () => { + const entries = parseAcpxStdoutLine( + emit({ type: "acpx.text_delta", text: "hello", channel: "output", tag: "agent_message_chunk" }), + TS, + ); + expect(entries).toEqual([ + { kind: "assistant", ts: TS, text: "hello", delta: true }, + ]); + }); + + it("routes thought text_delta to the thinking transcript", () => { + const entries = parseAcpxStdoutLine( + emit({ type: "acpx.text_delta", text: "thinking…", channel: "thought" }), + TS, + ); + expect(entries).toEqual([ + { kind: "thinking", ts: TS, text: "thinking…", delta: true }, + ]); + }); + + it("falls back to stream when channel is missing", () => { + const entries = parseAcpxStdoutLine( + emit({ type: "acpx.text_delta", text: "thinking…", stream: "thought" }), + TS, + ); + expect(entries[0]).toMatchObject({ kind: "thinking" }); + }); + + it("renders status events as system text with optional ctx usage", () => { + expect( + parseAcpxStdoutLine( + emit({ type: "acpx.status", text: "thinking", tag: "agent_thought_chunk" }), + TS, + ), + ).toEqual([{ kind: "system", ts: TS, text: "thinking" }]); + + expect( + parseAcpxStdoutLine( + emit({ type: "acpx.status", tag: "context_window", used: 12000, size: 200000 }), + TS, + ), + ).toEqual([{ kind: "system", ts: TS, text: "context_window (12000/200000 ctx)" }]); + }); + + it("emits a tool_call entry that preserves toolCallId, status, and input", () => { + const entries = parseAcpxStdoutLine( + emit({ + type: "acpx.tool_call", + name: "read", + toolCallId: "tool-1", + status: "running", + text: "read README.md", + }), + TS, + ); + expect(entries).toEqual([ + { + kind: "tool_call", + ts: TS, + name: "read", + toolUseId: "tool-1", + input: { text: "read README.md", status: "running" }, + }, + ]); + }); + + it("emits a paired tool_result entry when a tool_call reports terminal status", () => { + const completed = parseAcpxStdoutLine( + emit({ + type: "acpx.tool_call", + name: "read", + toolCallId: "tool-1", + status: "completed", + text: "ok", + }), + TS, + ); + expect(completed[1]).toEqual({ + kind: "tool_result", + ts: TS, + toolUseId: "tool-1", + toolName: "read", + content: "ok", + isError: false, + }); + + const failed = parseAcpxStdoutLine( + emit({ + type: "acpx.tool_call", + name: "edit", + toolCallId: "tool-2", + status: "failed", + text: "permission denied", + }), + TS, + ); + expect(failed[1]).toMatchObject({ kind: "tool_result", isError: true, content: "permission denied" }); + }); + + it("renders acpx.result with summary fallback to stopReason", () => { + const entries = parseAcpxStdoutLine( + emit({ type: "acpx.result", summary: "completed", stopReason: "end_turn" }), + TS, + ); + expect(entries[0]).toMatchObject({ kind: "result", text: "completed", subtype: "end_turn", isError: false }); + }); + + it("treats acpx.error as a stderr entry", () => { + const entries = parseAcpxStdoutLine( + emit({ type: "acpx.error", message: "auth required", code: "ACP_AUTH" }), + TS, + ); + expect(entries).toEqual([{ kind: "stderr", ts: TS, text: "auth required" }]); + }); + + it("renders unknown acpx.* events as system entries", () => { + const entries = parseAcpxStdoutLine( + emit({ type: "acpx.misc", message: "unhandled" }), + TS, + ); + expect(entries).toEqual([{ kind: "system", ts: TS, text: "unhandled" }]); + }); + + it("falls back to a stdout entry for non-JSON lines", () => { + const entries = parseAcpxStdoutLine("not json", TS); + expect(entries).toEqual([{ kind: "stdout", ts: TS, text: "not json" }]); + }); +}); diff --git a/packages/adapters/acpx-local/src/ui/parse-stdout.ts b/packages/adapters/acpx-local/src/ui/parse-stdout.ts new file mode 100644 index 00000000..019e8f33 --- /dev/null +++ b/packages/adapters/acpx-local/src/ui/parse-stdout.ts @@ -0,0 +1,158 @@ +import type { TranscriptEntry } from "@paperclipai/adapter-utils"; + +function parseJson(line: string): Record | null { + try { + const parsed = JSON.parse(line); + if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null; + return parsed as Record; + } catch { + return null; + } +} + +function asString(value: unknown, fallback = ""): string { + return typeof value === "string" ? value : fallback; +} + +function asNumber(value: unknown, fallback = 0): number { + return typeof value === "number" && Number.isFinite(value) ? value : fallback; +} + +function stringify(value: unknown): string { + if (typeof value === "string") return value; + if (value === null || value === undefined) return ""; + try { + return JSON.stringify(value, null, 2); + } catch { + return String(value); + } +} + +function pickToolUseId(parsed: Record): string { + return ( + asString(parsed.toolCallId) || + asString(parsed.toolUseId) || + asString(parsed.id) + ); +} + +function statusText(parsed: Record): string { + const text = asString(parsed.text).trim(); + const tag = asString(parsed.tag).trim(); + const used = asNumber(parsed.used, -1); + const size = asNumber(parsed.size, -1); + const parts: string[] = []; + if (text) parts.push(text); + if (tag && !text) parts.push(tag); + if (used >= 0 && size > 0) parts.push(`(${used}/${size} ctx)`); + return parts.join(" ") || tag || "status"; +} + +export function parseAcpxStdoutLine(line: string, ts: string): TranscriptEntry[] { + const parsed = parseJson(line); + if (!parsed) return [{ kind: "stdout", ts, text: line }]; + + const type = asString(parsed.type); + if (type === "acpx.session") { + const agent = asString(parsed.agent, "acpx"); + const mode = asString(parsed.mode); + const permissionMode = asString(parsed.permissionMode); + const tail = [mode, permissionMode].filter(Boolean).join(" / "); + return [{ + kind: "init", + ts, + model: tail ? `${agent} (${tail})` : agent, + sessionId: + asString(parsed.acpSessionId) || + asString(parsed.sessionId) || + asString(parsed.runtimeSessionName), + }]; + } + + if (type === "acpx.text_delta") { + const text = asString(parsed.text); + if (!text) return []; + const channel = asString(parsed.channel) || asString(parsed.stream); + return [{ + kind: channel === "thought" || channel === "thinking" ? "thinking" : "assistant", + ts, + text, + delta: true, + }]; + } + + if (type === "acpx.tool_call") { + const status = asString(parsed.status); + const text = asString(parsed.text); + const name = asString(parsed.name, "acp_tool"); + const toolUseId = pickToolUseId(parsed); + const input = + parsed.input !== undefined + ? parsed.input + : text || status + ? { ...(text ? { text } : {}), ...(status ? { status } : {}) } + : {}; + const entries: TranscriptEntry[] = [ + { + kind: "tool_call", + ts, + name, + toolUseId: toolUseId || undefined, + input, + }, + ]; + if (status === "completed" || status === "failed" || status === "cancelled") { + entries.push({ + kind: "tool_result", + ts, + toolUseId: toolUseId || name, + toolName: name, + content: text || status, + isError: status !== "completed", + }); + } + return entries; + } + + if (type === "acpx.tool_result") { + return [{ + kind: "tool_result", + ts, + toolUseId: pickToolUseId(parsed) || asString(parsed.name, "acp_tool"), + toolName: asString(parsed.name) || undefined, + content: stringify(parsed.content ?? parsed.output ?? parsed.error), + isError: parsed.isError === true || parsed.error !== undefined, + }]; + } + + if (type === "acpx.status") { + return [{ kind: "system", ts, text: statusText(parsed) }]; + } + + if (type === "acpx.result") { + return [{ + kind: "result", + ts, + text: asString(parsed.summary, asString(parsed.stopReason, asString(parsed.text))), + inputTokens: asNumber(parsed.inputTokens), + outputTokens: asNumber(parsed.outputTokens), + cachedTokens: asNumber(parsed.cachedTokens), + costUsd: asNumber(parsed.costUsd), + subtype: asString(parsed.subtype, asString(parsed.stopReason, "acpx.result")), + isError: parsed.isError === true, + errors: Array.isArray(parsed.errors) + ? parsed.errors.map((error) => stringify(error)).filter(Boolean) + : [], + }]; + } + + if (type === "acpx.error") { + return [{ kind: "stderr", ts, text: asString(parsed.message, line) }]; + } + + if (type.startsWith("acpx.")) { + return [{ kind: "system", ts, text: asString(parsed.message, type) }]; + } + + return [{ kind: "stdout", ts, text: line }]; +} diff --git a/packages/adapters/acpx-local/tsconfig.json b/packages/adapters/acpx-local/tsconfig.json new file mode 100644 index 00000000..e1b71318 --- /dev/null +++ b/packages/adapters/acpx-local/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"] +} diff --git a/packages/adapters/acpx-local/vitest.config.ts b/packages/adapters/acpx-local/vitest.config.ts new file mode 100644 index 00000000..f624398e --- /dev/null +++ b/packages/adapters/acpx-local/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + environment: "node", + }, +}); diff --git a/packages/shared/src/constants.ts b/packages/shared/src/constants.ts index 16211b38..8b196e93 100644 --- a/packages/shared/src/constants.ts +++ b/packages/shared/src/constants.ts @@ -30,6 +30,7 @@ export type AgentStatus = (typeof AGENT_STATUSES)[number]; export const AGENT_ADAPTER_TYPES = [ "process", "http", + "acpx_local", "claude_local", "codex_local", "gemini_local", diff --git a/packages/shared/src/environment-support.ts b/packages/shared/src/environment-support.ts index 0ebb3ff9..f63ad707 100644 --- a/packages/shared/src/environment-support.ts +++ b/packages/shared/src/environment-support.ts @@ -31,6 +31,7 @@ export interface EnvironmentCapabilities { } const REMOTE_MANAGED_ADAPTERS = new Set([ + "acpx_local", "claude_local", "codex_local", "cursor", diff --git a/scripts/capture-acpx-skills-screenshots.mjs b/scripts/capture-acpx-skills-screenshots.mjs new file mode 100644 index 00000000..ee184c66 --- /dev/null +++ b/scripts/capture-acpx-skills-screenshots.mjs @@ -0,0 +1,43 @@ +#!/usr/bin/env node +import path from "node:path"; +import fs from "node:fs/promises"; +import { fileURLToPath } from "node:url"; + +const repoRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url))); +const playwrightPkgRoot = path.join(repoRoot, "node_modules/.pnpm/playwright@1.58.2/node_modules/playwright"); +const { chromium } = await import(path.join(playwrightPkgRoot, "index.mjs")); + +const baseUrl = process.env.STORYBOOK_BASE_URL ?? "http://127.0.0.1:6007"; +const outDir = process.env.OUT_DIR ?? path.join(repoRoot, "screenshots/pap-2999"); +await fs.mkdir(outDir, { recursive: true }); + +const stories = [ + { id: "adapters-acpx-local--skills-tab-claude", slug: "skills-claude" }, + { id: "adapters-acpx-local--skills-tab-codex", slug: "skills-codex" }, + { id: "adapters-acpx-local--skills-tab-custom", slug: "skills-custom" }, + { id: "adapters-acpx-local--skills-tab-loading", slug: "skills-loading" }, + { id: "adapters-acpx-local--skills-tab-empty-library", slug: "skills-empty-library" }, +]; + +const themes = [ + { name: "light", apply: false }, + { name: "dark", apply: true }, +]; + +const browser = await chromium.launch(); +try { + const context = await browser.newContext({ viewport: { width: 1280, height: 1100 } }); + const page = await context.newPage(); + for (const story of stories) { + for (const theme of themes) { + const url = `${baseUrl}/iframe.html?args=&id=${story.id}&viewMode=story&globals=theme:${theme.name}`; + await page.goto(url, { waitUntil: "load" }); + await page.waitForTimeout(1500); + const target = path.join(outDir, `${story.slug}-${theme.name}.png`); + await page.screenshot({ path: target, fullPage: true }); + console.log(`captured ${target}`); + } + } +} finally { + await browser.close(); +} diff --git a/scripts/run-vitest-stable.mjs b/scripts/run-vitest-stable.mjs index b9473434..e016719f 100644 --- a/scripts/run-vitest-stable.mjs +++ b/scripts/run-vitest-stable.mjs @@ -11,6 +11,7 @@ const nonServerProjects = [ "@paperclipai/shared", "@paperclipai/db", "@paperclipai/adapter-utils", + "@paperclipai/adapter-acpx-local", "@paperclipai/adapter-codex-local", "@paperclipai/adapter-opencode-local", "@paperclipai/ui", diff --git a/server/package.json b/server/package.json index ab81280e..bd19e53f 100644 --- a/server/package.json +++ b/server/package.json @@ -44,6 +44,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.888.0", + "@paperclipai/adapter-acpx-local": "workspace:*", "@paperclipai/adapter-claude-local": "workspace:*", "@paperclipai/adapter-codex-local": "workspace:*", "@paperclipai/adapter-cursor-local": "workspace:*", diff --git a/server/src/__tests__/acpx-local-adapter-environment.test.ts b/server/src/__tests__/acpx-local-adapter-environment.test.ts new file mode 100644 index 00000000..0883fae0 --- /dev/null +++ b/server/src/__tests__/acpx-local-adapter-environment.test.ts @@ -0,0 +1,129 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { testEnvironment } from "@paperclipai/adapter-acpx-local/server"; +import type { AdapterEnvironmentCheck } from "@paperclipai/adapter-utils"; + +function credentialChecks(checks: AdapterEnvironmentCheck[]): AdapterEnvironmentCheck[] { + return checks.filter((check) => check.code.startsWith("acpx_claude_") || check.code.startsWith("acpx_codex_")); +} + +describe("acpx_local environment credential diagnostics", () => { + beforeEach(() => { + vi.stubEnv("ANTHROPIC_API_KEY", ""); + vi.stubEnv("ANTHROPIC_BEDROCK_BASE_URL", ""); + vi.stubEnv("CLAUDE_CODE_USE_BEDROCK", ""); + vi.stubEnv("CLAUDE_CONFIG_DIR", ""); + vi.stubEnv("OPENAI_API_KEY", ""); + vi.stubEnv("CODEX_HOME", ""); + }); + + afterEach(() => { + vi.unstubAllEnvs(); + }); + + it("emits an info-level Claude credential hint when ANTHROPIC_API_KEY is present", async () => { + const result = await testEnvironment({ + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "claude", + env: { + ANTHROPIC_API_KEY: "sk-ant-test", + }, + }, + }); + + expect(result.checks).toContainEqual(expect.objectContaining({ + code: "acpx_claude_anthropic_api_key_detected", + level: "info", + })); + expect(result.checks.some((check) => check.code.startsWith("acpx_codex_"))).toBe(false); + }); + + it("emits an info-level Claude missing credential hint without changing diagnostic health", async () => { + const root = path.join(os.tmpdir(), `paperclip-acpx-claude-noauth-${Date.now()}-${Math.random().toString(16).slice(2)}`); + const claudeConfigDir = path.join(root, ".claude"); + + try { + await fs.mkdir(claudeConfigDir, { recursive: true }); + + const result = await testEnvironment({ + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "claude", + env: { + CLAUDE_CONFIG_DIR: claudeConfigDir, + }, + }, + }); + + expect(result.checks).toContainEqual(expect.objectContaining({ + code: "acpx_claude_credentials_missing", + level: "info", + })); + expect(credentialChecks(result.checks).every((check) => check.level === "info")).toBe(true); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("emits an info-level Codex credential hint when native auth is present", async () => { + const root = path.join(os.tmpdir(), `paperclip-acpx-codex-auth-${Date.now()}-${Math.random().toString(16).slice(2)}`); + const codexHome = path.join(root, ".codex"); + + try { + await fs.mkdir(codexHome, { recursive: true }); + await fs.writeFile(path.join(codexHome, "auth.json"), JSON.stringify({ accessToken: "token" }), "utf8"); + + const result = await testEnvironment({ + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "codex", + env: { + CODEX_HOME: codexHome, + }, + }, + }); + + expect(result.checks).toContainEqual(expect.objectContaining({ + code: "acpx_codex_native_auth_detected", + level: "info", + })); + expect(result.checks.some((check) => check.code.startsWith("acpx_claude_"))).toBe(false); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("emits an info-level Codex missing credential hint without changing diagnostic health", async () => { + const root = path.join(os.tmpdir(), `paperclip-acpx-codex-noauth-${Date.now()}-${Math.random().toString(16).slice(2)}`); + const codexHome = path.join(root, ".codex"); + + try { + await fs.mkdir(codexHome, { recursive: true }); + + const result = await testEnvironment({ + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "codex", + env: { + CODEX_HOME: codexHome, + }, + }, + }); + + expect(result.checks).toContainEqual(expect.objectContaining({ + code: "acpx_codex_credentials_missing", + level: "info", + })); + expect(credentialChecks(result.checks).every((check) => check.level === "info")).toBe(true); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); +}); diff --git a/server/src/__tests__/acpx-local-execute.test.ts b/server/src/__tests__/acpx-local-execute.test.ts new file mode 100644 index 00000000..ff9c46cb --- /dev/null +++ b/server/src/__tests__/acpx-local-execute.test.ts @@ -0,0 +1,603 @@ +import { describe, expect, it } from "vitest"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import type { AdapterExecutionContext } from "@paperclipai/adapter-utils"; +import { createAcpxLocalExecutor } from "@paperclipai/adapter-acpx-local/server"; +import type { + AcpRuntime, + AcpRuntimeEvent, + AcpRuntimeHandle, + AcpRuntimeOptions, + AcpRuntimeTurn, + AcpRuntimeTurnResult, +} from "acpx/runtime"; + +type LogEntry = { stream: "stdout" | "stderr"; chunk: string }; +type TestAcpRuntimeOptions = AcpRuntimeOptions & { + sessionOptions?: { + systemPrompt?: string | { append: string }; + additionalRoots?: string[]; + }; +}; + +class FakeRuntime implements AcpRuntime { + ensureInputs: Array<{ sessionKey: string; agent: string; mode: "persistent" | "oneshot"; cwd?: string; resumeSessionId?: string }> = []; + startInputs: Array<{ handle: AcpRuntimeHandle; text: string; requestId: string; timeoutMs?: number }> = []; + closeInputs: Array<{ handle: AcpRuntimeHandle; reason: string; discardPersistentState?: boolean }> = []; + cancelInputs: Array<{ handle: AcpRuntimeHandle; reason?: string }> = []; + setModeInputs: Array<{ handle: AcpRuntimeHandle; mode: string }> = []; + setConfigInputs: Array<{ handle: AcpRuntimeHandle; key: string; value: string }> = []; + ensureCount = 0; + turnCount = 0; + nextEnsureError: Error | null = null; + + constructor( + readonly options: TestAcpRuntimeOptions, + readonly events: AcpRuntimeEvent[] = [ + { type: "status", text: "thinking", tag: "agent_thought_chunk" }, + { type: "text_delta", text: "hello ", stream: "output", tag: "agent_message_chunk" }, + { type: "tool_call", text: "read README.md", title: "read", status: "running", toolCallId: "tool-1" }, + { type: "text_delta", text: "world", stream: "output", tag: "agent_message_chunk" }, + ], + readonly terminal: AcpRuntimeTurnResult = { status: "completed", stopReason: "end_turn" }, + ) {} + + async ensureSession(input: { sessionKey: string; agent: string; mode: "persistent" | "oneshot"; cwd?: string; resumeSessionId?: string }): Promise { + this.ensureInputs.push(input); + this.ensureCount += 1; + if (this.nextEnsureError) { + const err = this.nextEnsureError; + this.nextEnsureError = null; + throw err; + } + return { + sessionKey: input.sessionKey, + backend: "acpx", + runtimeSessionName: `runtime-${this.ensureCount}`, + cwd: input.cwd, + acpxRecordId: `record-${this.ensureCount}`, + backendSessionId: `acp-${this.ensureCount}`, + agentSessionId: `agent-${this.ensureCount}`, + }; + } + + startTurn(input: { handle: AcpRuntimeHandle; text: string; requestId: string; timeoutMs?: number }): AcpRuntimeTurn { + this.startInputs.push(input); + this.turnCount += 1; + let closed = false; + const events = this.events; + const terminal = this.terminal; + const cancelInputs = this.cancelInputs; + return { + requestId: input.requestId, + events: { + [Symbol.asyncIterator]: async function* () { + for (const event of events) { + if (closed) return; + yield event; + } + }, + }, + result: Promise.resolve(terminal), + cancel: async (args?: { reason?: string }) => { + cancelInputs.push({ handle: input.handle, reason: args?.reason }); + closed = true; + }, + closeStream: async () => { + closed = true; + }, + }; + } + + runTurn(): AsyncIterable { + throw new Error("not used"); + } + + getCapabilities() { + return { controls: [] }; + } + + getStatus() { + return Promise.resolve({}); + } + + async setMode(input: { handle: AcpRuntimeHandle; mode: string }) { + this.setModeInputs.push(input); + } + + async setConfigOption(input: { handle: AcpRuntimeHandle; key: string; value: string }) { + this.setConfigInputs.push(input); + } + + async cancel(input: { handle: AcpRuntimeHandle; reason?: string }) { + this.cancelInputs.push(input); + } + + async close(input: { handle: AcpRuntimeHandle; reason: string; discardPersistentState?: boolean }) { + this.closeInputs.push(input); + } +} + +async function createRuntimeSkill(root: string, input: { + key?: string; + runtimeName?: string; + body?: string; +}) { + const runtimeName = input.runtimeName ?? "paperclip-test-skill"; + const key = input.key ?? `company/${runtimeName}`; + const source = path.join(root, "skills", runtimeName); + await fs.mkdir(source, { recursive: true }); + await fs.writeFile(path.join(source, "SKILL.md"), input.body ?? "---\nrequired: false\n---\nUse the test skill.\n", "utf8"); + return { + key, + runtimeName, + source, + required: false, + }; +} + +function parseStdoutLogs(logs: LogEntry[]) { + return logs + .filter((entry) => entry.stream === "stdout") + .flatMap((entry) => entry.chunk.trim().split(/\n+/).filter(Boolean)) + .map((line) => JSON.parse(line) as Record); +} + +function buildContext(root: string, overrides: Partial = {}): AdapterExecutionContext { + return { + runId: "run-1", + agent: { + id: "agent-1", + companyId: "company-1", + name: "ACPX Coder", + adapterType: "acpx_local", + adapterConfig: {}, + }, + runtime: { + sessionId: null, + sessionParams: null, + sessionDisplayId: null, + taskKey: "PAP-1", + }, + config: { + agent: "claude", + cwd: root, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + }, + context: { + issueId: "issue-1", + paperclipTaskMarkdown: "Task context", + }, + onLog: async () => {}, + ...overrides, + }; +} + +describe("acpx_local execute", () => { + it("streams ACPX session, status, text, and tool events before returning success", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-success-")); + try { + const runtime = new FakeRuntime({} as AcpRuntimeOptions); + const logs: LogEntry[] = []; + let metaPermissionNote = ""; + const execute = createAcpxLocalExecutor({ + createRuntime: () => runtime, + }); + const result = await execute(buildContext(root, { + onLog: async (stream, chunk) => logs.push({ stream, chunk }), + onMeta: async (meta) => { + metaPermissionNote = meta.commandNotes?.join("\n") ?? ""; + }, + })); + + expect(result.exitCode).toBe(0); + expect(result.summary).toBe("hello world"); + expect(result.sessionParams).toMatchObject({ + agent: "claude", + cwd: root, + mode: "persistent", + acpSessionId: "acp-1", + }); + expect(metaPermissionNote).toContain("Effective ACPX permission mode: approve-all"); + const parsed = parseStdoutLogs(logs); + expect(parsed.map((event) => event.type)).toEqual([ + "acpx.session", + "acpx.status", + "acpx.text_delta", + "acpx.tool_call", + "acpx.text_delta", + "acpx.result", + ]); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("reuses a compatible warm session and starts fresh when cwd changes", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-reuse-")); + const other = path.join(root, "other"); + await fs.mkdir(other); + try { + const runtimes: FakeRuntime[] = []; + const execute = createAcpxLocalExecutor({ + createRuntime: (options) => { + const runtime = new FakeRuntime(options); + runtimes.push(runtime); + return runtime; + }, + }); + + const first = await execute(buildContext(root)); + const second = await execute(buildContext(root, { + runtime: { + sessionId: first.sessionId ?? null, + sessionParams: first.sessionParams ?? null, + sessionDisplayId: first.sessionDisplayId ?? null, + taskKey: "PAP-1", + }, + })); + const third = await execute(buildContext(root, { + runtime: { + sessionId: first.sessionId ?? null, + sessionParams: first.sessionParams ?? null, + sessionDisplayId: first.sessionDisplayId ?? null, + taskKey: "PAP-1", + }, + config: { + agent: "claude", + cwd: other, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + }, + })); + + expect(runtimes).toHaveLength(2); + expect(runtimes[0].ensureCount).toBe(1); + expect(runtimes[0].turnCount).toBe(2); + expect(runtimes[1].ensureCount).toBe(1); + expect(second.sessionParams?.acpSessionId).toBe("acp-1"); + expect(third.sessionParams?.cwd).toBe(other); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("closes duplicate warm handles from concurrent runs for the same session key", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-concurrent-")); + try { + const runtimes: FakeRuntime[] = []; + const warmHandles = new Map(); + const execute = createAcpxLocalExecutor({ + warmHandles, + createRuntime: (options) => { + const runtime = new FakeRuntime(options); + runtimes.push(runtime); + return runtime; + }, + }); + + const [first, second] = await Promise.all([ + execute(buildContext(root, { runId: "run-1" })), + execute(buildContext(root, { runId: "run-2" })), + ]); + + expect(first.exitCode).toBe(0); + expect(second.exitCode).toBe(0); + expect(runtimes).toHaveLength(2); + expect(warmHandles.size).toBe(1); + expect(runtimes.flatMap((runtime) => runtime.closeInputs).filter((input) => + input.reason === "paperclip duplicate warm handle cleanup" + )).toHaveLength(1); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("retries with a fresh session when ACPX cannot resume the saved backend session", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-resume-")); + try { + const runtime = new FakeRuntime({} as AcpRuntimeOptions); + const firstExecute = createAcpxLocalExecutor({ + createRuntime: () => runtime, + warmHandles: new Map(), + }); + const initial = await firstExecute(buildContext(root)); + const compatibleParams = { + ...initial.sessionParams, + runtimeSessionName: "runtime-old", + acpSessionId: "acp-old", + }; + runtime.nextEnsureError = new Error("session/load failed: no session acp-old"); + const logs: LogEntry[] = []; + const execute = createAcpxLocalExecutor({ + createRuntime: () => runtime, + warmHandles: new Map(), + }); + const result = await execute(buildContext(root, { + runtime: { + sessionId: "acp-old", + sessionParams: compatibleParams, + sessionDisplayId: "acp-old", + taskKey: "PAP-1", + }, + onLog: async (stream, chunk) => logs.push({ stream, chunk }), + })); + + expect(result.exitCode).toBe(0); + expect(result.clearSession).toBe(true); + expect(runtime.ensureInputs.at(-2)?.resumeSessionId).toBe("acp-old"); + expect(runtime.ensureInputs.at(-1)?.resumeSessionId).toBeUndefined(); + expect(logs.some((entry) => entry.chunk.includes("retrying with a fresh session"))).toBe(true); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("cancels and closes stale handles on timeout", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-timeout-")); + try { + const neverFinishes = new FakeRuntime( + {} as AcpRuntimeOptions, + [], + { status: "cancelled", stopReason: "cancelled" }, + ); + neverFinishes.startTurn = function (input): AcpRuntimeTurn { + this.startInputs.push(input); + let resolveResult!: (value: AcpRuntimeTurnResult) => void; + const result = new Promise((resolve) => { + resolveResult = resolve; + }); + return { + requestId: input.requestId, + events: { + [Symbol.asyncIterator]: async function* () { + await new Promise((resolve) => setTimeout(resolve, 50)); + }, + }, + result, + cancel: async (args?: { reason?: string }) => { + this.cancelInputs.push({ handle: input.handle, reason: args?.reason }); + resolveResult({ status: "cancelled", stopReason: args?.reason }); + }, + closeStream: async () => {}, + }; + }; + const execute = createAcpxLocalExecutor({ createRuntime: () => neverFinishes }); + const result = await execute(buildContext(root, { + config: { + agent: "claude", + cwd: root, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + timeoutSec: 0.01, + }, + })); + + expect(result.timedOut).toBe(true); + expect(result.errorCode).toBe("acpx_timeout"); + expect(neverFinishes.cancelInputs.length).toBeGreaterThan(0); + expect(neverFinishes.closeInputs.at(-1)?.discardPersistentState).toBe(true); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("returns structured auth errors", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-error-")); + try { + const runtime = new FakeRuntime({} as AcpRuntimeOptions); + runtime.nextEnsureError = new Error("authentication required: login first"); + const execute = createAcpxLocalExecutor({ createRuntime: () => runtime }); + const result = await execute(buildContext(root)); + expect(result.exitCode).toBe(1); + expect(result.errorCode).toBe("acpx_auth_required"); + expect(result.errorMeta).toMatchObject({ category: "auth" }); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("returns structured ACP protocol errors", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-protocol-")); + try { + const runtime = new FakeRuntime({} as AcpRuntimeOptions); + runtime.nextEnsureError = Object.assign(new Error("protocol init failed"), { + code: "ACP_SESSION_INIT_FAILED", + }); + const execute = createAcpxLocalExecutor({ createRuntime: () => runtime }); + const result = await execute(buildContext(root)); + expect(result.exitCode).toBe(1); + expect(result.errorCode).toBe("acpx_protocol_error"); + expect(result.errorMeta).toMatchObject({ + category: "protocol", + acpCode: "ACP_SESSION_INIT_FAILED", + }); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("materializes selected skills for ACPX Claude and passes public session metadata", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-claude-skills-")); + try { + const skill = await createRuntimeSkill(root, {}); + let runtime: FakeRuntime | null = null; + let meta: Record | null = null; + const execute = createAcpxLocalExecutor({ + createRuntime: (options) => { + runtime = new FakeRuntime(options); + return runtime; + }, + }); + + const result = await execute(buildContext(root, { + config: { + agent: "claude", + cwd: root, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + paperclipRuntimeSkills: [skill], + paperclipSkillSync: { + desiredSkills: [skill.key], + }, + }, + onMeta: async (payload) => { + meta = payload as Record; + }, + })); + + expect(result.exitCode).toBe(0); + expect(runtime?.options).not.toHaveProperty("sessionOptions"); + const skillRoot = result.sessionParams?.skills && typeof result.sessionParams.skills === "object" + ? (result.sessionParams.skills as { skillRoot?: string | null }).skillRoot + : null; + expect(skillRoot).toContain(path.join("state", "runtime-skills", "claude")); + await expect(fs.lstat(path.join(skillRoot!, skill.runtimeName))).resolves.toMatchObject({}); + expect(result.sessionParams?.skills).toMatchObject({ + mode: "claude", + selectedSkills: [skill.runtimeName], + }); + expect(String(meta?.prompt ?? "")).toContain(`Skill root: ${skillRoot}`); + expect((meta?.commandNotes as string[]).join("\n")).toContain("Materialized 1 Paperclip skill"); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("includes skill content in the ACPX Claude session fingerprint", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-claude-fingerprint-")); + try { + const skill = await createRuntimeSkill(root, { body: "---\nrequired: false\n---\nFirst version.\n" }); + const runtimes: FakeRuntime[] = []; + const execute = createAcpxLocalExecutor({ + createRuntime: (options) => { + const runtime = new FakeRuntime(options); + runtimes.push(runtime); + return runtime; + }, + }); + const context = buildContext(root, { + config: { + agent: "claude", + cwd: root, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + paperclipRuntimeSkills: [skill], + paperclipSkillSync: { + desiredSkills: [skill.key], + }, + }, + }); + + const first = await execute(context); + await fs.writeFile(path.join(skill.source, "SKILL.md"), "---\nrequired: false\n---\nSecond version.\n", "utf8"); + const second = await execute({ + ...context, + runtime: { + sessionId: first.sessionId ?? null, + sessionParams: first.sessionParams ?? null, + sessionDisplayId: first.sessionDisplayId ?? null, + taskKey: "PAP-1", + }, + }); + + expect(second.sessionParams?.configFingerprint).not.toBe(first.sessionParams?.configFingerprint); + expect(runtimes.at(-1)?.ensureInputs.at(-1)?.resumeSessionId).toBeUndefined(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("materializes selected skills into the effective ACPX Codex CODEX_HOME", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-codex-skills-")); + try { + const skill = await createRuntimeSkill(root, {}); + const codexHome = path.join(root, "codex-home"); + let runtime: FakeRuntime | null = null; + let meta: Record | null = null; + const execute = createAcpxLocalExecutor({ + createRuntime: (options) => { + runtime = new FakeRuntime(options); + return runtime; + }, + }); + + const result = await execute(buildContext(root, { + config: { + agent: "codex", + cwd: root, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + env: { CODEX_HOME: codexHome }, + paperclipRuntimeSkills: [skill], + paperclipSkillSync: { + desiredSkills: [skill.key], + }, + }, + onMeta: async (payload) => { + meta = payload as Record; + }, + })); + + expect(result.exitCode).toBe(0); + await expect(fs.lstat(path.join(codexHome, "skills", skill.runtimeName))).resolves.toMatchObject({}); + const wrapperPath = runtime?.options.agentRegistry.resolve("codex"); + const wrapper = await fs.readFile(wrapperPath!, "utf8"); + expect(wrapper).not.toContain("CODEX_HOME"); + expect(wrapper).not.toContain(codexHome); + expect((meta?.env as Record).CODEX_HOME).toBe(codexHome); + expect(result.sessionParams?.skills).toMatchObject({ + mode: "codex", + codexHome, + selectedSkills: [skill.runtimeName], + }); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("keeps ACPX custom skill selection tracked without runtime materialization", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-acpx-custom-skills-")); + try { + const skill = await createRuntimeSkill(root, {}); + let runtime: FakeRuntime | null = null; + let meta: Record | null = null; + const execute = createAcpxLocalExecutor({ + createRuntime: (options) => { + runtime = new FakeRuntime(options); + return runtime; + }, + }); + + const result = await execute(buildContext(root, { + config: { + agent: "custom", + agentCommand: "custom-acp", + cwd: root, + stateDir: path.join(root, "state"), + promptTemplate: "Do the assigned work.", + paperclipRuntimeSkills: [skill], + paperclipSkillSync: { + desiredSkills: [skill.key], + }, + }, + onMeta: async (payload) => { + meta = payload as Record; + }, + })); + + expect(result.exitCode).toBe(0); + expect(runtime?.options.sessionOptions).toBeUndefined(); + await expect(fs.lstat(path.join(root, "state", "runtime-skills"))).rejects.toMatchObject({ code: "ENOENT" }); + expect(result.sessionParams?.skills).toMatchObject({ + mode: "custom_unsupported", + desiredSkillNames: [skill.key], + }); + expect((meta?.commandNotes as string[]).join("\n")).toContain("tracked only"); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); +}); diff --git a/server/src/__tests__/acpx-local-skill-sync.test.ts b/server/src/__tests__/acpx-local-skill-sync.test.ts new file mode 100644 index 00000000..5da02709 --- /dev/null +++ b/server/src/__tests__/acpx-local-skill-sync.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from "vitest"; +import { + listAcpxSkills, + syncAcpxSkills, +} from "@paperclipai/adapter-acpx-local/server"; + +describe("acpx local skill sync", () => { + const paperclipKey = "paperclipai/paperclip/paperclip"; + const createAgentKey = "paperclipai/paperclip/paperclip-create-agent"; + + it("reports ACPX Claude skills as supported runtime-mounted state", async () => { + const snapshot = await listAcpxSkills({ + agentId: "agent-1", + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "claude", + paperclipSkillSync: { + desiredSkills: [paperclipKey], + }, + }, + }); + + expect(snapshot.adapterType).toBe("acpx_local"); + expect(snapshot.supported).toBe(true); + expect(snapshot.mode).toBe("ephemeral"); + expect(snapshot.desiredSkills).toContain(paperclipKey); + expect(snapshot.desiredSkills).toContain(createAgentKey); + expect(snapshot.entries.find((entry) => entry.key === paperclipKey)?.state).toBe("configured"); + expect(snapshot.entries.find((entry) => entry.key === paperclipKey)?.detail).toContain("ACPX Claude session"); + expect(snapshot.warnings).toEqual([]); + }); + + it("reports ACPX Codex skills with Codex home runtime detail", async () => { + const snapshot = await syncAcpxSkills({ + agentId: "agent-2", + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "codex", + paperclipSkillSync: { + desiredSkills: ["paperclip"], + }, + }, + }, ["paperclip"]); + + expect(snapshot.supported).toBe(true); + expect(snapshot.mode).toBe("ephemeral"); + expect(snapshot.desiredSkills).toContain(paperclipKey); + expect(snapshot.desiredSkills).not.toContain("paperclip"); + expect(snapshot.entries.find((entry) => entry.key === paperclipKey)?.state).toBe("configured"); + expect(snapshot.entries.find((entry) => entry.key === paperclipKey)?.detail).toContain("CODEX_HOME/skills/"); + expect(snapshot.warnings).toEqual([]); + }); + + it("keeps ACPX custom skill selection tracked but unsupported", async () => { + const snapshot = await listAcpxSkills({ + agentId: "agent-3", + companyId: "company-1", + adapterType: "acpx_local", + config: { + agent: "custom", + paperclipSkillSync: { + desiredSkills: [paperclipKey], + }, + }, + }); + + expect(snapshot.supported).toBe(false); + expect(snapshot.mode).toBe("unsupported"); + expect(snapshot.desiredSkills).toContain(paperclipKey); + expect(snapshot.entries.find((entry) => entry.key === paperclipKey)?.desired).toBe(true); + expect(snapshot.entries.find((entry) => entry.key === paperclipKey)?.detail).toContain("stored in Paperclip only"); + expect(snapshot.warnings).toContain( + "Custom ACP commands do not expose a Paperclip skill integration contract yet; selected skills are tracked only.", + ); + }); +}); diff --git a/server/src/__tests__/adapter-routes.test.ts b/server/src/__tests__/adapter-routes.test.ts index eede2af2..6fa67915 100644 --- a/server/src/__tests__/adapter-routes.test.ts +++ b/server/src/__tests__/adapter-routes.test.ts @@ -202,6 +202,11 @@ describe("adapter routes", () => { const codexLocal = res.body.find((a: any) => a.type === "codex_local"); expect(codexLocal).toBeDefined(); expect(codexLocal.capabilities.supportsSkills).toBe(true); + + // acpx_local exposes runtime-aware skill snapshots for Claude/Codex/custom ACP agents + const acpxLocal = res.body.find((a: any) => a.type === "acpx_local"); + expect(acpxLocal).toBeDefined(); + expect(acpxLocal.capabilities.supportsSkills).toBe(true); }); it("uses the active adapter when resolving config schema for a paused builtin override", async () => { @@ -225,6 +230,31 @@ describe("adapter routes", () => { }); }); + it("serves the built-in acpx_local config schema", async () => { + const app = createApp(); + + const res = await request(app).get("/api/adapters/acpx_local/config-schema"); + + expect(res.status, JSON.stringify(res.body)).toBe(200); + expect(res.body.fields).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + key: "agent", + default: "claude", + options: expect.arrayContaining([ + expect.objectContaining({ value: "claude" }), + expect.objectContaining({ value: "codex" }), + expect.objectContaining({ value: "custom" }), + ]), + }), + expect.objectContaining({ + key: "permissionMode", + default: "approve-all", + }), + ]), + ); + }); + it("rejects signed-in users without org access", async () => { const app = createApp({ userId: "outsider-1", diff --git a/server/src/__tests__/adapter-session-codecs.test.ts b/server/src/__tests__/adapter-session-codecs.test.ts index 27efe287..10905e51 100644 --- a/server/src/__tests__/adapter-session-codecs.test.ts +++ b/server/src/__tests__/adapter-session-codecs.test.ts @@ -13,6 +13,7 @@ import { sessionCodec as opencodeSessionCodec, isOpenCodeUnknownSessionError, } from "@paperclipai/adapter-opencode-local/server"; +import { sessionCodec as acpxSessionCodec } from "@paperclipai/adapter-acpx-local/server"; describe("adapter session codecs", () => { it("normalizes claude session params with cwd", () => { @@ -107,6 +108,50 @@ describe("adapter session codecs", () => { }); expect(geminiSessionCodec.getDisplayId?.(serialized ?? null)).toBe("gemini-session-1"); }); + + it("preserves acpx session params required for compatibility checks", () => { + const parsed = acpxSessionCodec.deserialize({ + sessionKey: "paperclip:company:agent:task:fingerprint", + runtimeSessionName: "runtime-session-1", + acpxRecordId: "record-1", + acpSessionId: "acp-session-1", + agentSessionId: "agent-session-1", + agent: "claude", + cwd: "/tmp/acpx", + mode: "persistent", + stateDir: "/tmp/acpx-state", + configFingerprint: "fingerprint", + workspaceId: "workspace-1", + repoUrl: "https://example.com/repo.git", + repoRef: "main", + remoteExecution: { + environmentId: "environment-1", + leaseId: "lease-1", + }, + }); + + expect(parsed).toMatchObject({ + sessionKey: "paperclip:company:agent:task:fingerprint", + runtimeSessionName: "runtime-session-1", + acpxRecordId: "record-1", + acpSessionId: "acp-session-1", + agentSessionId: "agent-session-1", + agent: "claude", + cwd: "/tmp/acpx", + mode: "persistent", + stateDir: "/tmp/acpx-state", + configFingerprint: "fingerprint", + workspaceId: "workspace-1", + repoUrl: "https://example.com/repo.git", + repoRef: "main", + remoteExecution: { + environmentId: "environment-1", + leaseId: "lease-1", + }, + }); + expect(acpxSessionCodec.serialize(parsed)).toEqual(parsed); + expect(acpxSessionCodec.getDisplayId?.(parsed)).toBe("runtime-session-1"); + }); }); describe("codex resume recovery detection", () => { diff --git a/server/src/__tests__/agent-skills-routes.test.ts b/server/src/__tests__/agent-skills-routes.test.ts index 4dd60ce8..84537a9b 100644 --- a/server/src/__tests__/agent-skills-routes.test.ts +++ b/server/src/__tests__/agent-skills-routes.test.ts @@ -362,6 +362,99 @@ describe.sequential("agent skill routes", () => { expect(res.status, JSON.stringify(res.body)).toBe(200); }); + it("passes ACPX Claude config through the agent skill listing route", async () => { + mockAgentService.getById.mockResolvedValue({ + ...makeAgent("acpx_local"), + adapterConfig: { agent: "claude" }, + }); + mockSecretService.resolveAdapterConfigForRuntime.mockResolvedValueOnce({ + config: { agent: "claude" }, + }); + mockAdapter.listSkills.mockResolvedValue({ + adapterType: "acpx_local", + supported: true, + mode: "ephemeral", + desiredSkills: ["paperclipai/paperclip/paperclip"], + entries: [], + warnings: [], + }); + + const res = await requestApp( + await createApp(), + (baseUrl) => request(baseUrl) + .get("/api/agents/11111111-1111-4111-8111-111111111111/skills?companyId=company-1"), + ); + + expect(res.status, JSON.stringify(res.body)).toBe(200); + expect(mockCompanySkillService.listRuntimeSkillEntries).toHaveBeenCalledWith("company-1", { + materializeMissing: false, + }); + expect(mockAdapter.listSkills).toHaveBeenCalledWith( + expect.objectContaining({ + adapterType: "acpx_local", + config: expect.objectContaining({ + agent: "claude", + paperclipRuntimeSkills: expect.any(Array), + }), + }), + ); + }); + + it("persists ACPX Codex desired skills through the agent skill sync route", async () => { + mockAgentService.getById.mockResolvedValue({ + ...makeAgent("acpx_local"), + adapterConfig: { agent: "codex" }, + }); + mockAgentService.update.mockImplementationOnce(async (_id: string, patch: Record) => ({ + ...makeAgent("acpx_local"), + adapterConfig: patch.adapterConfig ?? {}, + })); + mockSecretService.resolveAdapterConfigForRuntime.mockResolvedValueOnce({ + config: { + agent: "codex", + paperclipSkillSync: { + desiredSkills: ["paperclipai/paperclip/paperclip"], + }, + }, + }); + mockAdapter.syncSkills.mockResolvedValue({ + adapterType: "acpx_local", + supported: true, + mode: "ephemeral", + desiredSkills: ["paperclipai/paperclip/paperclip"], + entries: [], + warnings: [], + }); + + const res = await requestApp(await createApp(), (baseUrl) => request(baseUrl) + .post("/api/agents/11111111-1111-4111-8111-111111111111/skills/sync?companyId=company-1") + .send({ desiredSkills: ["paperclip"] })); + + expect(res.status, JSON.stringify(res.body)).toBe(200); + expect(mockAgentService.update).toHaveBeenCalledWith( + expect.any(String), + expect.objectContaining({ + adapterConfig: expect.objectContaining({ + agent: "codex", + paperclipSkillSync: expect.objectContaining({ + desiredSkills: ["paperclipai/paperclip/paperclip"], + }), + }), + }), + expect.any(Object), + ); + expect(mockAdapter.syncSkills).toHaveBeenCalledWith( + expect.objectContaining({ + adapterType: "acpx_local", + config: expect.objectContaining({ + agent: "codex", + paperclipRuntimeSkills: expect.any(Array), + }), + }), + ["paperclipai/paperclip/paperclip"], + ); + }); + it("keeps runtime materialization for persistent skill adapters", async () => { mockAgentService.getById.mockResolvedValue(makeAgent("cursor")); mockAdapter.listSkills.mockResolvedValue({ diff --git a/server/src/__tests__/redaction.test.ts b/server/src/__tests__/redaction.test.ts index e22eb597..e5b00cff 100644 --- a/server/src/__tests__/redaction.test.ts +++ b/server/src/__tests__/redaction.test.ts @@ -84,4 +84,51 @@ describe("redaction", () => { expect(result).not.toContain(githubToken); expect(result).not.toContain(jwt); }); + + it("redacts inline secrets from command metadata without hiding safe command text", () => { + const input = { + command: "custom-acp --token ghp_example_secret env OPENAI_API_KEY=sk-live-example custom-acp", + commandArgs: ["--safe", "ok", "--token", "ghp_arg_secret", "--api-key=sk-inline-example"], + env: { + PAPERCLIP_RESOLVED_COMMAND: "env OPENAI_API_KEY=sk-live-example custom-acp --token ghp_example_secret", + SAFE_VALUE: "visible", + }, + }; + + const result = redactEventPayload(input); + + expect(result?.command).toBe( + `custom-acp --token ${REDACTED_EVENT_VALUE} env OPENAI_API_KEY=${REDACTED_EVENT_VALUE} custom-acp`, + ); + expect(result?.commandArgs).toEqual([ + "--safe", + "ok", + "--token", + REDACTED_EVENT_VALUE, + `--api-key=${REDACTED_EVENT_VALUE}`, + ]); + expect(result?.env).toEqual({ + PAPERCLIP_RESOLVED_COMMAND: + `env OPENAI_API_KEY=${REDACTED_EVENT_VALUE} custom-acp --token ${REDACTED_EVENT_VALUE}`, + SAFE_VALUE: "visible", + }); + }); + + it("redacts non-string command args after secret flags", () => { + const result = redactEventPayload({ + commandArgs: ["--api-key", { nested: "secret-value" }, "safe-next"], + }); + + expect(result?.commandArgs).toEqual(["--api-key", REDACTED_EVENT_VALUE, "safe-next"]); + }); + + it("does not treat bare args payloads as command args", () => { + const result = redactEventPayload({ + args: ["--api-key", "not-a-command-secret"], + argv: ["--api-key", "command-secret"], + }); + + expect(result?.args).toEqual(["--api-key", "not-a-command-secret"]); + expect(result?.argv).toEqual(["--api-key", REDACTED_EVENT_VALUE]); + }); }); diff --git a/server/src/adapters/builtin-adapter-types.ts b/server/src/adapters/builtin-adapter-types.ts index 463a5694..3028ae0c 100644 --- a/server/src/adapters/builtin-adapter-types.ts +++ b/server/src/adapters/builtin-adapter-types.ts @@ -2,6 +2,7 @@ * Adapter types shipped with Paperclip. External plugins must not replace these. */ export const BUILTIN_ADAPTER_TYPES = new Set([ + "acpx_local", "claude_local", "codex_local", "cursor", diff --git a/server/src/adapters/registry.ts b/server/src/adapters/registry.ts index 94c38e29..359aecd4 100644 --- a/server/src/adapters/registry.ts +++ b/server/src/adapters/registry.ts @@ -1,5 +1,14 @@ import type { AdapterModelProfileDefinition, ServerAdapterModule } from "./types.js"; import { getAdapterSessionManagement } from "@paperclipai/adapter-utils"; +import { + execute as acpxExecute, + testEnvironment as acpxTestEnvironment, + sessionCodec as acpxSessionCodec, + getConfigSchema as getAcpxConfigSchema, + listAcpxSkills, + syncAcpxSkills, +} from "@paperclipai/adapter-acpx-local/server"; +import { agentConfigurationDoc as acpxAgentConfigurationDoc } from "@paperclipai/adapter-acpx-local"; import { execute as claudeExecute, listClaudeSkills, @@ -154,6 +163,22 @@ const claudeLocalAdapter: ServerAdapterModule = { getQuotaWindows: claudeGetQuotaWindows, }; +const acpxLocalAdapter: ServerAdapterModule = { + type: "acpx_local", + execute: acpxExecute, + testEnvironment: acpxTestEnvironment, + listSkills: listAcpxSkills, + syncSkills: syncAcpxSkills, + sessionCodec: acpxSessionCodec, + sessionManagement: getAdapterSessionManagement("acpx_local") ?? undefined, + supportsLocalAgentJwt: true, + supportsInstructionsBundle: true, + instructionsPathKey: "instructionsFilePath", + requiresMaterializedRuntimeSkills: false, + agentConfigurationDoc: acpxAgentConfigurationDoc, + getConfigSchema: getAcpxConfigSchema, +}; + const codexLocalAdapter: ServerAdapterModule = { type: "codex_local", execute: codexExecute, @@ -335,6 +360,7 @@ const pausedOverrides = new Set(); function registerBuiltInAdapters() { for (const adapter of [ + acpxLocalAdapter, claudeLocalAdapter, codexLocalAdapter, openCodeLocalAdapter, diff --git a/server/src/adapters/utils.ts b/server/src/adapters/utils.ts index da3767dd..a2682f23 100644 --- a/server/src/adapters/utils.ts +++ b/server/src/adapters/utils.ts @@ -64,7 +64,8 @@ export function buildInvocationEnvForLogs( const resolvedCommand = options.resolvedCommand?.trim(); if (resolvedCommand) { - merged[options.resolvedCommandEnvKey ?? "PAPERCLIP_RESOLVED_COMMAND"] = resolvedCommand; + merged[options.resolvedCommandEnvKey ?? "PAPERCLIP_RESOLVED_COMMAND"] = + serverUtils.redactCommandTextForLogs(resolvedCommand); } return redactEnvForLogs(merged); diff --git a/server/src/redaction.ts b/server/src/redaction.ts index 75ebd56e..f3877a8b 100644 --- a/server/src/redaction.ts +++ b/server/src/redaction.ts @@ -1,12 +1,13 @@ +import { redactCommandText } from "@paperclipai/adapter-utils"; + const SECRET_PAYLOAD_KEY_RE = /(api[-_]?key|access[-_]?token|auth(?:_?token)?|authorization|bearer|secret|passwd|password|credential|jwt|private[-_]?key|cookie|connectionstring)/i; +const COMMAND_PAYLOAD_KEY_RE = + /(^command$|^cmd$|command[-_]?line|resolved[-_]?command|PAPERCLIP_RESOLVED_COMMAND)/i; +const COMMAND_ARGS_PAYLOAD_KEY_RE = /^(commandArgs|command_?args|argv)$/i; const JWT_VALUE_RE = /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?$/; -const JWT_TEXT_RE = /\b[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}(?:\.[A-Za-z0-9_-]{8,})?\b/g; -const OPENAI_KEY_TEXT_RE = /\bsk-[A-Za-z0-9_-]{12,}\b/g; -const GITHUB_TOKEN_TEXT_RE = /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/g; -const AUTHORIZATION_BEARER_TEXT_RE = /(\bAuthorization\s*:\s*Bearer\s+)[^\s"'`]+/gi; -const ENV_SECRET_ASSIGNMENT_TEXT_RE = - /(\b[A-Za-z0-9_]*(?:TOKEN|KEY|SECRET|PASSWORD|PASSWD|AUTHORIZATION|JWT)[A-Za-z0-9_]*\s*=\s*)[^\s"'`]+/gi; +const CLI_SECRET_FLAG_RE = + /^-{1,2}(?:api[-_]?key|(?:access[-_]?|auth[-_]?)?token|token|authorization|bearer|secret|passwd|password|credential|jwt|private[-_]?key|cookie|connectionstring)$/i; const JSON_SECRET_FIELD_TEXT_RE = /((?:"|')?(?:api[-_]?key|access[-_]?token|auth(?:_?token)?|authorization|bearer|secret|passwd|password|credential|jwt|private[-_]?key|cookie|connectionstring)(?:"|')?\s*:\s*(?:"|'))[^"'`\r\n]+((?:"|'))/gi; const ESCAPED_JSON_SECRET_FIELD_TEXT_RE = @@ -38,9 +39,33 @@ function isPlainBinding(value: unknown): value is { type: "plain"; value: unknow return value.type === "plain" && "value" in value; } +function sanitizeCommandArgs(args: unknown[]): unknown[] { + let redactNext = false; + return args.map((arg) => { + if (redactNext) { + redactNext = false; + return REDACTED_EVENT_VALUE; + } + if (typeof arg !== "string") return sanitizeValue(arg); + if (CLI_SECRET_FLAG_RE.test(arg.trim())) { + redactNext = true; + return arg; + } + return redactSensitiveText(arg); + }); +} + export function sanitizeRecord(record: Record): Record { const redacted: Record = {}; for (const [key, value] of Object.entries(record)) { + if (COMMAND_ARGS_PAYLOAD_KEY_RE.test(key) && Array.isArray(value)) { + redacted[key] = sanitizeCommandArgs(value); + continue; + } + if (COMMAND_PAYLOAD_KEY_RE.test(key) && typeof value === "string") { + redacted[key] = redactSensitiveText(value); + continue; + } if (SECRET_PAYLOAD_KEY_RE.test(key)) { if (isSecretRefBinding(value)) { redacted[key] = sanitizeValue(value); @@ -69,12 +94,10 @@ export function redactEventPayload(payload: Record | null): Rec } export function redactSensitiveText(input: string): string { - return input - .replace(AUTHORIZATION_BEARER_TEXT_RE, `$1${REDACTED_EVENT_VALUE}`) - .replace(JSON_SECRET_FIELD_TEXT_RE, `$1${REDACTED_EVENT_VALUE}$2`) - .replace(ESCAPED_JSON_SECRET_FIELD_TEXT_RE, `$1${REDACTED_EVENT_VALUE}$2`) - .replace(ENV_SECRET_ASSIGNMENT_TEXT_RE, `$1${REDACTED_EVENT_VALUE}`) - .replace(OPENAI_KEY_TEXT_RE, REDACTED_EVENT_VALUE) - .replace(GITHUB_TOKEN_TEXT_RE, REDACTED_EVENT_VALUE) - .replace(JWT_TEXT_RE, REDACTED_EVENT_VALUE); + return redactCommandText( + input + .replace(JSON_SECRET_FIELD_TEXT_RE, `$1${REDACTED_EVENT_VALUE}$2`) + .replace(ESCAPED_JSON_SECRET_FIELD_TEXT_RE, `$1${REDACTED_EVENT_VALUE}$2`), + REDACTED_EVENT_VALUE, + ); } diff --git a/server/src/routes/agents.ts b/server/src/routes/agents.ts index 2dbe8ad8..6b663a85 100644 --- a/server/src/routes/agents.ts +++ b/server/src/routes/agents.ts @@ -72,6 +72,12 @@ import { redactCurrentUserValue } from "../log-redaction.js"; import { renderOrgChartSvg, renderOrgChartPng, type OrgNode, type OrgChartStyle, ORG_CHART_STYLES } from "./org-chart-svg.js"; import { instanceSettingsService } from "../services/instance-settings.js"; import { runClaudeLogin } from "@paperclipai/adapter-claude-local/server"; +import { + DEFAULT_ACPX_LOCAL_AGENT, + DEFAULT_ACPX_LOCAL_MODE, + DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS, + DEFAULT_ACPX_LOCAL_PERMISSION_MODE, +} from "@paperclipai/adapter-acpx-local"; import { DEFAULT_CODEX_LOCAL_BYPASS_APPROVALS_AND_SANDBOX, DEFAULT_CODEX_LOCAL_MODEL, @@ -110,6 +116,7 @@ export function agentRoutes( // Legacy hardcoded maps — used as fallback when adapter module does not // declare capability flags explicitly. const DEFAULT_INSTRUCTIONS_PATH_KEYS: Record = { + acpx_local: "instructionsFilePath", claude_local: "instructionsFilePath", codex_local: "instructionsFilePath", droid_local: "instructionsFilePath", @@ -826,6 +833,21 @@ export function agentRoutes( adapterConfig: Record, ): Record { const next = { ...adapterConfig }; + if (adapterType === "acpx_local") { + if (!asNonEmptyString(next.agent)) { + next.agent = DEFAULT_ACPX_LOCAL_AGENT; + } + if (!asNonEmptyString(next.mode)) { + next.mode = DEFAULT_ACPX_LOCAL_MODE; + } + if (!asNonEmptyString(next.permissionMode)) { + next.permissionMode = DEFAULT_ACPX_LOCAL_PERMISSION_MODE; + } + if (!asNonEmptyString(next.nonInteractivePermissions)) { + next.nonInteractivePermissions = DEFAULT_ACPX_LOCAL_NON_INTERACTIVE_PERMISSIONS; + } + return ensureGatewayDeviceKey(adapterType, next); + } if (adapterType === "codex_local") { if (!asNonEmptyString(next.model)) { next.model = DEFAULT_CODEX_LOCAL_MODEL; diff --git a/server/src/services/environment-execution-target.ts b/server/src/services/environment-execution-target.ts index 49ceac60..0f2f70db 100644 --- a/server/src/services/environment-execution-target.ts +++ b/server/src/services/environment-execution-target.ts @@ -34,6 +34,7 @@ export async function resolveEnvironmentExecutionTarget(input: { if (input.environment.driver === "sandbox") { if ( + input.adapterType !== "acpx_local" && input.adapterType !== "codex_local" && input.adapterType !== "claude_local" && input.adapterType !== "gemini_local" && @@ -106,6 +107,7 @@ export async function resolveEnvironmentExecutionTarget(input: { if ( ( input.adapterType !== "codex_local" && + input.adapterType !== "acpx_local" && input.adapterType !== "claude_local" && input.adapterType !== "gemini_local" && input.adapterType !== "opencode_local" && diff --git a/server/src/services/heartbeat.ts b/server/src/services/heartbeat.ts index a76b15a8..f7c0a220 100644 --- a/server/src/services/heartbeat.ts +++ b/server/src/services/heartbeat.ts @@ -121,6 +121,7 @@ import { recoveryService } from "./recovery/service.js"; import { productivityReviewService } from "./productivity-review.js"; import { withAgentStartLock } from "./agent-start-lock.js"; import { redactCurrentUserText, redactCurrentUserValue } from "../log-redaction.js"; +import { redactEventPayload } from "../redaction.js"; import { hasSessionCompactionThresholds, resolveSessionCompactionPolicy, @@ -3118,9 +3119,10 @@ export function heartbeatService(db: Db, options: HeartbeatServiceOptions = {}) const boundedPayload = event.payload ? boundHeartbeatRunEventPayloadForStorage(event.payload) : event.payload; - const sanitizedPayload = boundedPayload - ? redactCurrentUserValue(boundedPayload, currentUserRedactionOptions) - : boundedPayload; + const secretSanitizedPayload = boundedPayload ? redactEventPayload(boundedPayload) : boundedPayload; + const sanitizedPayload = secretSanitizedPayload + ? redactCurrentUserValue(secretSanitizedPayload, currentUserRedactionOptions) + : secretSanitizedPayload; await db.insert(heartbeatRunEvents).values({ companyId: run.companyId, diff --git a/ui/package.json b/ui/package.json index dda6e715..6160df07 100644 --- a/ui/package.json +++ b/ui/package.json @@ -34,6 +34,7 @@ "@dnd-kit/utilities": "^3.2.2", "@lexical/link": "0.35.0", "@mdxeditor/editor": "^3.52.4", + "@paperclipai/adapter-acpx-local": "workspace:*", "@paperclipai/adapter-claude-local": "workspace:*", "@paperclipai/adapter-codex-local": "workspace:*", "@paperclipai/adapter-cursor-local": "workspace:*", diff --git a/ui/src/adapters/acpx-local/index.ts b/ui/src/adapters/acpx-local/index.ts new file mode 100644 index 00000000..d8ae9675 --- /dev/null +++ b/ui/src/adapters/acpx-local/index.ts @@ -0,0 +1,11 @@ +import type { UIAdapterModule } from "../types"; +import { parseAcpxStdoutLine, buildAcpxLocalConfig } from "@paperclipai/adapter-acpx-local/ui"; +import { SchemaConfigFields } from "../schema-config-fields"; + +export const acpxLocalUIAdapter: UIAdapterModule = { + type: "acpx_local", + label: "ACPX (local)", + parseStdoutLine: parseAcpxStdoutLine, + ConfigFields: SchemaConfigFields, + buildAdapterConfig: buildAcpxLocalConfig, +}; diff --git a/ui/src/adapters/adapter-display-registry.ts b/ui/src/adapters/adapter-display-registry.ts index fe809273..d75da557 100644 --- a/ui/src/adapters/adapter-display-registry.ts +++ b/ui/src/adapters/adapter-display-registry.ts @@ -49,9 +49,18 @@ export interface AdapterDisplayInfo { recommended?: boolean; comingSoon?: boolean; disabledLabel?: string; + experimental?: boolean; + hideFromVisualSelection?: boolean; } const adapterDisplayMap: Record = { + acpx_local: { + label: "ACPX", + description: "Experimental local ACPX multi-agent adapter", + icon: Bot, + experimental: true, + hideFromVisualSelection: true, + }, claude_local: { label: "Claude Code", description: "Local Claude agent", diff --git a/ui/src/adapters/metadata.test.ts b/ui/src/adapters/metadata.test.ts index 70b7ef3c..c08c2f21 100644 --- a/ui/src/adapters/metadata.test.ts +++ b/ui/src/adapters/metadata.test.ts @@ -1,5 +1,10 @@ import { describe, expect, it } from "vitest"; -import { isEnabledAdapterType, listAdapterOptions } from "./metadata"; +import { + isEnabledAdapterType, + isValidAdapterType, + isVisualAdapterChoice, + listAdapterOptions, +} from "./metadata"; import type { UIAdapterModule } from "./types"; const externalAdapter: UIAdapterModule = { @@ -22,6 +27,7 @@ describe("adapter metadata", () => { label: "external_test", comingSoon: false, hidden: false, + experimental: false, }, ]); }); @@ -30,4 +36,27 @@ describe("adapter metadata", () => { expect(isEnabledAdapterType("process")).toBe(false); expect(isEnabledAdapterType("http")).toBe(false); }); -}); \ No newline at end of file + + it("keeps ACPX selectable from explicit configuration but out of visual pickers", () => { + expect(isEnabledAdapterType("acpx_local")).toBe(true); + expect(isValidAdapterType("acpx_local")).toBe(true); + expect(isVisualAdapterChoice("acpx_local")).toBe(false); + + expect( + listAdapterOptions((type) => type, [ + { + ...externalAdapter, + type: "acpx_local", + }, + ]), + ).toEqual([ + { + value: "acpx_local", + label: "acpx_local", + comingSoon: false, + hidden: false, + experimental: true, + }, + ]); + }); +}); diff --git a/ui/src/adapters/metadata.ts b/ui/src/adapters/metadata.ts index 297a7237..d19d0093 100644 --- a/ui/src/adapters/metadata.ts +++ b/ui/src/adapters/metadata.ts @@ -15,6 +15,7 @@ export interface AdapterOptionMetadata { label: string; comingSoon: boolean; hidden: boolean; + experimental: boolean; } export function listKnownAdapterTypes(): string[] { @@ -43,6 +44,15 @@ export function isValidAdapterType(type: string): boolean { return true; } +/** + * Check whether an adapter should appear in card-style visual pickers. + * Experimental adapters can remain selectable from explicit configuration + * dropdowns without being recommended during onboarding or setup flows. + */ +export function isVisualAdapterChoice(type: string): boolean { + return !getAdapterDisplay(type).hideFromVisualSelection; +} + /** * Build option metadata for a list of adapters (for dropdowns). * `labelFor` callback allows callers to override labels; defaults to display registry. @@ -57,6 +67,7 @@ export function listAdapterOptions( label: getLabel(adapter.type), comingSoon: !!getAdapterDisplay(adapter.type).comingSoon, hidden: isAdapterTypeHidden(adapter.type), + experimental: !!getAdapterDisplay(adapter.type).experimental, })); } diff --git a/ui/src/adapters/registry.ts b/ui/src/adapters/registry.ts index e8e24eaf..d53eaaae 100644 --- a/ui/src/adapters/registry.ts +++ b/ui/src/adapters/registry.ts @@ -1,4 +1,5 @@ import type { UIAdapterModule } from "./types"; +import { acpxLocalUIAdapter } from "./acpx-local"; import { claudeLocalUIAdapter } from "./claude-local"; import { codexLocalUIAdapter } from "./codex-local"; import { cursorLocalUIAdapter } from "./cursor"; @@ -49,6 +50,7 @@ setDynamicParserResultNotifier(notifyAdapterChange); function registerBuiltInUIAdapters() { for (const adapter of [ + acpxLocalUIAdapter, claudeLocalUIAdapter, codexLocalUIAdapter, geminiLocalUIAdapter, diff --git a/ui/src/adapters/use-adapter-capabilities.ts b/ui/src/adapters/use-adapter-capabilities.ts index 631c01f3..786776fe 100644 --- a/ui/src/adapters/use-adapter-capabilities.ts +++ b/ui/src/adapters/use-adapter-capabilities.ts @@ -16,6 +16,7 @@ const ALL_FALSE: AdapterCapabilities = { * return correct values on first render before the /api/adapters call resolves. */ const KNOWN_DEFAULTS: Record = { + acpx_local: { supportsInstructionsBundle: true, supportsSkills: true, supportsLocalAgentJwt: true, requiresMaterializedRuntimeSkills: false, supportsModelProfiles: false }, claude_local: { supportsInstructionsBundle: true, supportsSkills: true, supportsLocalAgentJwt: true, requiresMaterializedRuntimeSkills: false, supportsModelProfiles: true }, codex_local: { supportsInstructionsBundle: true, supportsSkills: true, supportsLocalAgentJwt: true, requiresMaterializedRuntimeSkills: false, supportsModelProfiles: true }, cursor: { supportsInstructionsBundle: true, supportsSkills: true, supportsLocalAgentJwt: true, requiresMaterializedRuntimeSkills: true, supportsModelProfiles: true }, diff --git a/ui/src/components/AgentConfigForm.tsx b/ui/src/components/AgentConfigForm.tsx index f1af84a6..c36463ab 100644 --- a/ui/src/components/AgentConfigForm.tsx +++ b/ui/src/components/AgentConfigForm.tsx @@ -52,7 +52,7 @@ import { ReportsToPicker } from "./ReportsToPicker"; import { EnvVarEditor } from "./EnvVarEditor"; import { shouldShowLegacyWorkingDirectoryField } from "../lib/legacy-agent-config"; import { listAdapterOptions, listVisibleAdapterTypes } from "../adapters/metadata"; -import { getAdapterLabel } from "../adapters/adapter-display-registry"; +import { getAdapterDisplay, getAdapterLabel } from "../adapters/adapter-display-registry"; import { useDisabledAdaptersSync } from "../adapters/use-disabled-adapters"; import { buildAgentUpdatePatch, type AgentConfigOverlay } from "../lib/agent-config-patch"; import { useAdapterCapabilities } from "../adapters/use-adapter-capabilities"; @@ -1239,6 +1239,7 @@ function AdapterTypeDropdown({ disabledTypes: Set; }) { const [open, setOpen] = useState(false); + const selectedDisplay = getAdapterDisplay(value); const adapterList = useMemo( () => listAdapterOptions((type) => adapterLabels[type] ?? getAdapterLabel(type)).filter( @@ -1251,9 +1252,10 @@ function AdapterTypeDropdown({ @@ -1280,6 +1282,7 @@ function AdapterTypeDropdown({ {item.value === "opencode_local" ? : null} {item.label} + {item.experimental && } {item.comingSoon && ( Coming soon @@ -1291,6 +1294,14 @@ function AdapterTypeDropdown({ ); } +function ExperimentalBadge() { + return ( + + Experimental + + ); +} + function ModelDropdown({ models, value, diff --git a/ui/src/components/NewAgentDialog.tsx b/ui/src/components/NewAgentDialog.tsx index 4ff672c6..6400038d 100644 --- a/ui/src/components/NewAgentDialog.tsx +++ b/ui/src/components/NewAgentDialog.tsx @@ -17,6 +17,7 @@ import { } from "lucide-react"; import { cn } from "@/lib/utils"; import { listUIAdapters } from "../adapters"; +import { isVisualAdapterChoice } from "../adapters/metadata"; import { getAdapterDisplay } from "../adapters/adapter-display-registry"; import { useDisabledAdaptersSync } from "../adapters/use-disabled-adapters"; @@ -57,7 +58,11 @@ export function NewAgentDialog() { // This automatically includes external/plugin adapters. const adapterGrid = useMemo(() => { const registered = listUIAdapters() - .filter((a) => isAgentAdapterType(a.type) && !disabledTypes.has(a.type)); + .filter((a) => + isAgentAdapterType(a.type) && + !disabledTypes.has(a.type) && + isVisualAdapterChoice(a.type) + ); // Sort: recommended first, then alphabetical return registered diff --git a/ui/src/components/OnboardingWizard.tsx b/ui/src/components/OnboardingWizard.tsx index 9ec608f3..5000d759 100644 --- a/ui/src/components/OnboardingWizard.tsx +++ b/ui/src/components/OnboardingWizard.tsx @@ -25,6 +25,7 @@ import { } from "../lib/model-utils"; import { getUIAdapter } from "../adapters"; import { listUIAdapters } from "../adapters"; +import { isVisualAdapterChoice } from "../adapters/metadata"; import { useDisabledAdaptersSync } from "../adapters/use-disabled-adapters"; import { useAdapterCapabilities } from "../adapters/use-adapter-capabilities"; import { getAdapterDisplay } from "../adapters/adapter-display-registry"; @@ -209,7 +210,11 @@ export function OnboardingWizard() { const { recommendedAdapters, moreAdapters } = useMemo(() => { const SYSTEM_ADAPTER_TYPES = new Set(["process", "http"]); const all = listUIAdapters() - .filter((a) => !SYSTEM_ADAPTER_TYPES.has(a.type) && !disabledTypes.has(a.type)) + .filter((a) => + !SYSTEM_ADAPTER_TYPES.has(a.type) && + !disabledTypes.has(a.type) && + isVisualAdapterChoice(a.type) + ) .map((a) => ({ ...getAdapterDisplay(a.type), type: a.type })); return { diff --git a/ui/src/pages/AgentDetail.tsx b/ui/src/pages/AgentDetail.tsx index 0eca9441..d1dddfed 100644 --- a/ui/src/pages/AgentDetail.tsx +++ b/ui/src/pages/AgentDetail.tsx @@ -27,6 +27,7 @@ import { PageTabBar } from "../components/PageTabBar"; import { adapterLabels, roleLabels, help } from "../components/agent-config-primitives"; import { ToggleSwitch } from "@/components/ui/toggle-switch"; import { useAdapterCapabilities } from "@/adapters/use-adapter-capabilities"; +import { redactCommandText as redactCommandSecretText } from "@paperclipai/adapter-utils"; import { MarkdownEditor } from "../components/MarkdownEditor"; import { assetsApi } from "../api/assets"; import { getUIAdapter, buildTranscript, onAdapterChange } from "../adapters"; @@ -115,6 +116,7 @@ const RUN_LOG_PAGE_BYTES = 256_000; const REDACTED_ENV_VALUE = "***REDACTED***"; const SECRET_ENV_KEY_RE = /(api[-_]?key|access[-_]?token|auth(?:_?token)?|authorization|bearer|secret|passwd|password|credential|jwt|private[-_]?key|cookie|connectionstring)/i; +const COMMAND_ENV_KEY_RE = /(^command$|^cmd$|command[-_]?line|resolved[-_]?command|PAPERCLIP_RESOLVED_COMMAND)/i; const JWT_VALUE_RE = /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?$/; function redactPathText(value: string, censorUsernameInLogs: boolean) { @@ -125,6 +127,10 @@ function redactPathValue(value: T, censorUsernameInLogs: boolean): T { return redactHomePathUserSegmentsInValue(value, { enabled: censorUsernameInLogs }); } +function redactCommandText(value: string, censorUsernameInLogs: boolean): string { + return redactPathText(redactCommandSecretText(value, REDACTED_ENV_VALUE), censorUsernameInLogs); +} + function shouldRedactSecretValue(key: string, value: unknown): boolean { if (SECRET_ENV_KEY_RE.test(key)) return true; if (typeof value !== "string") return false; @@ -142,6 +148,7 @@ function redactEnvValue(key: string, value: unknown, censorUsernameInLogs: boole } if (shouldRedactSecretValue(key, value)) return REDACTED_ENV_VALUE; if (value === null || value === undefined) return ""; + if (typeof value === "string" && COMMAND_ENV_KEY_RE.test(key)) return redactCommandText(value, censorUsernameInLogs); if (typeof value === "string") return redactPathText(value, censorUsernameInLogs); try { return JSON.stringify(redactPathValue(value, censorUsernameInLogs)); @@ -302,7 +309,7 @@ export function RunInvocationCard({ payload: Record; censorUsernameInLogs: boolean; }) { - const commandLine = [ + const rawCommandLine = [ typeof payload.command === "string" ? payload.command : null, ...(Array.isArray(payload.commandArgs) ? payload.commandArgs.filter((value): value is string => typeof value === "string") @@ -310,6 +317,7 @@ export function RunInvocationCard({ ] .filter((value): value is string => Boolean(value)) .join(" "); + const commandLine = rawCommandLine ? redactCommandText(rawCommandLine, censorUsernameInLogs) : ""; const hasAdvancedDetails = commandLine.length > 0 @@ -2466,7 +2474,7 @@ function PromptEditorSkeleton() { ); } -function AgentSkillsTab({ +export function AgentSkillsTab({ agent, companyId, }: { @@ -2649,11 +2657,18 @@ function AgentSkillsTab({ }, [skillSnapshot?.mode]); const unsupportedSkillMessage = useMemo(() => { if (skillSnapshot?.mode !== "unsupported") return null; + if ( + agent.adapterType === "acpx_local" && + typeof agent.adapterConfig.agent === "string" && + agent.adapterConfig.agent === "custom" + ) { + return "Paperclip cannot manage skills for custom ACP commands yet."; + } if (agent.adapterType === "openclaw_gateway") { return "Paperclip cannot manage OpenClaw skills here. Visit your OpenClaw instance to manage this agent's skills."; } return "Paperclip cannot manage skills for this adapter yet. Manage them in the adapter directly."; - }, [agent.adapterType, skillSnapshot?.mode]); + }, [agent.adapterConfig.agent, agent.adapterType, skillSnapshot?.mode]); const hasUnsavedChanges = !arraysEqual(skillDraft, lastSavedSkills); const saveStatusLabel = syncSkills.isPending ? "Saving changes..." diff --git a/ui/storybook/.storybook/preview.tsx b/ui/storybook/.storybook/preview.tsx index 3d0397d2..8871f536 100644 --- a/ui/storybook/.storybook/preview.tsx +++ b/ui/storybook/.storybook/preview.tsx @@ -26,6 +26,12 @@ import "@mdxeditor/editor/style.css"; import "./tailwind-entry.css"; import "./styles.css"; +// Install fetch monkeypatch eagerly so any module-load-time fetches (e.g. schema +// caches in adapter config renderers) hit our fixtures before they reach the +// network. Some renderers issue a fetch from useEffect on first paint, which +// can otherwise race the StorybookProviders mount. +installStorybookApiFixtures(); + function installStorybookApiFixtures() { if (typeof window === "undefined") return; const currentWindow = window as typeof window & { @@ -148,6 +154,16 @@ function installStorybookApiFixtures() { return Response.json([]); } + const adapterSchemaMatch = url.pathname.match(/^\/api\/adapters\/([^/]+)\/config-schema$/); + if (adapterSchemaMatch) { + const [, adapterType] = adapterSchemaMatch; + const schemas = (window as typeof window & { + __paperclipStorybookAdapterSchemas?: Record; + }).__paperclipStorybookAdapterSchemas; + const schema = schemas?.[adapterType]; + if (schema) return Response.json(schema); + } + const companyResourceMatch = url.pathname.match(/^\/api\/companies\/([^/]+)\/([^/]+)$/); if (companyResourceMatch) { const [, companyId, resource] = companyResourceMatch; @@ -233,7 +249,6 @@ function StorybookProviders({ useEffect(() => { applyStorybookTheme(theme); - installStorybookApiFixtures(); }, [theme]); return ( diff --git a/ui/storybook/stories/acpx-local.stories.tsx b/ui/storybook/stories/acpx-local.stories.tsx new file mode 100644 index 00000000..93d30ed2 --- /dev/null +++ b/ui/storybook/stories/acpx-local.stories.tsx @@ -0,0 +1,896 @@ +import { useMemo, useState, type ReactNode } from "react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { useQueryClient } from "@tanstack/react-query"; +import type { AdapterConfigSchema, CreateConfigValues } from "@paperclipai/adapter-utils"; +import { parseAcpxStdoutLine } from "@paperclipai/adapter-acpx-local/ui"; +import type { + Agent, + AgentSkillSnapshot, + CompanySkillListItem, +} from "@paperclipai/shared"; +import { SchemaConfigFields } from "@/adapters/schema-config-fields"; +import type { TranscriptEntry } from "@/adapters"; +import { RunTranscriptView } from "@/components/transcript/RunTranscriptView"; +import { AgentSkillsTab } from "@/pages/AgentDetail"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { queryKeys } from "@/lib/queryKeys"; + +type SchemaWindow = typeof window & { + __paperclipStorybookAdapterSchemas?: Record; +}; + +// Mirrors packages/adapters/acpx-local/src/server/config-schema.ts. Inlined so the +// storybook bundle does not pull node-only imports from the adapter server entry. +const acpxLocalConfigSchema: AdapterConfigSchema = { + fields: [ + { + key: "agent", + label: "ACP agent", + type: "select", + default: "claude", + required: true, + options: [ + { value: "claude", label: "Claude via ACPX" }, + { value: "codex", label: "Codex via ACPX" }, + { value: "custom", label: "Custom ACP command" }, + ], + hint: "Choose the ACP agent launched through ACPX.", + }, + { + key: "agentCommand", + label: "Agent command", + type: "text", + hint: "Required for custom agents; optional override for built-in Claude or Codex ACP commands.", + }, + { + key: "mode", + label: "Session mode", + type: "select", + default: "persistent", + options: [ + { value: "persistent", label: "Persistent" }, + { value: "oneshot", label: "One shot" }, + ], + }, + { + key: "permissionMode", + label: "Permission mode", + type: "select", + default: "approve-all", + options: [ + { value: "approve-all", label: "Approve all" }, + { value: "default", label: "ACP default" }, + ], + hint: "Defaults to maximum permissions: ACPX permission requests are auto-approved.", + }, + { + key: "nonInteractivePermissions", + label: "Non-interactive permissions", + type: "select", + default: "deny", + options: [ + { value: "deny", label: "Deny" }, + { value: "fail", label: "Fail" }, + ], + }, + { + key: "cwd", + label: "Working directory", + type: "text", + hint: "Absolute fallback directory. Paperclip execution workspaces can override this at runtime.", + }, + { + key: "stateDir", + label: "State directory", + type: "text", + hint: "Optional ACPX session state directory. Defaults to Paperclip-managed company/agent scoped storage.", + }, + { + key: "instructionsFilePath", + label: "Instructions file", + type: "text", + hint: "Optional absolute path to markdown instructions injected into the run prompt.", + }, + { key: "promptTemplate", label: "Prompt template", type: "textarea" }, + { key: "bootstrapPromptTemplate", label: "Bootstrap prompt template", type: "textarea" }, + { key: "timeoutSec", label: "Timeout seconds", type: "number", default: 0 }, + { + key: "env", + label: "Environment JSON", + type: "textarea", + hint: "Optional JSON object of environment values or secret bindings.", + }, + ], +}; + +function installAcpxSchemaMock(): void { + if (typeof window === "undefined") return; + const win = window as SchemaWindow; + win.__paperclipStorybookAdapterSchemas = { + ...(win.__paperclipStorybookAdapterSchemas ?? {}), + acpx_local: acpxLocalConfigSchema, + }; +} + +function ConfigSection({ title, description, children }: { title: string; description?: string; children: ReactNode }) { + return ( + + + {title} + {description && ( +

{description}

+ )} + + +
{children}
+
+ + ); +} + +function AcpxLocalConfigStory() { + installAcpxSchemaMock(); + + const [values, setValues] = useState(() => ({ + name: "", + role: "", + title: "", + capabilities: "", + icon: "code", + adapterType: "acpx_local", + command: "", + promptTemplate: "", + bootstrapPromptTemplate: "", + instructionsFilePath: "", + extraArgs: "", + envVars: "", + envBindings: {}, + runtimeServicesJson: "", + runtimeDesiredState: "manual", + runtimeServiceStates: {}, + heartbeatEnabled: false, + intervalSec: 900, + wakeOnDemand: true, + cooldownSec: 60, + maxConcurrentRuns: 1, + pauseOnIdle: false, + idleTimeoutSec: 0, + runtimeMaxStuckHeartbeats: 0, + adapterSchemaValues: {}, + } as unknown as CreateConfigValues)); + + return ( +
+
+ + UX preview + +

Agent config — acpx_local

+

+ Renders the schema-driven adapter config block exactly as the operator sees it inside the agent edit form. + Defaults reflect Phase 3 of PAP-2944: maximum-permission auto-approve, persistent session mode, Claude as the + default ACP agent. +

+
+ + + setValues((current) => ({ ...current, ...patch }))} + config={{}} + eff={(_group, _field, original) => original} + mark={() => {}} + models={[]} + /> + + + +
+          {JSON.stringify(values.adapterSchemaValues ?? {}, null, 2)}
+        
+
+
+ ); +} + +const ACPX_TS_BASE = new Date("2026-04-30T15:30:00.000Z").getTime(); + +function ts(offsetMs: number): string { + return new Date(ACPX_TS_BASE + offsetMs).toISOString(); +} + +function flattenLines(lines: Array<{ payload: Record; offsetMs: number }>): TranscriptEntry[] { + const entries: TranscriptEntry[] = []; + for (const { payload, offsetMs } of lines) { + const parsed = parseAcpxStdoutLine(JSON.stringify(payload), ts(offsetMs)); + entries.push(...parsed); + } + return entries; +} + +function useAcpxTranscript(): TranscriptEntry[] { + return useMemo( + () => + flattenLines([ + { + offsetMs: 0, + payload: { + type: "acpx.session", + agent: "claude", + mode: "persistent", + permissionMode: "approve-all", + acpSessionId: "acp_session_42a8c1", + runtimeSessionName: "acpx-claude-PAP-1812", + }, + }, + { + offsetMs: 800, + payload: { + type: "acpx.status", + tag: "context_window", + used: 12000, + size: 200000, + }, + }, + { + offsetMs: 1200, + payload: { + type: "acpx.text_delta", + text: "Looking at the failing test in `runtime-state.test.ts` — ", + channel: "thought", + }, + }, + { + offsetMs: 1500, + payload: { + type: "acpx.text_delta", + text: "the assertion expects `pendingRestart` but the new state machine uses `restartScheduled`.\n", + channel: "thought", + }, + }, + { + offsetMs: 1900, + payload: { + type: "acpx.text_delta", + text: "I'll inspect the test file to confirm the change.\n\n", + channel: "output", + tag: "agent_message_chunk", + }, + }, + { + offsetMs: 2200, + payload: { + type: "acpx.tool_call", + name: "read", + toolCallId: "tool_read_01", + status: "running", + text: "server/src/runtime-state.test.ts", + input: { path: "server/src/runtime-state.test.ts" }, + }, + }, + { + offsetMs: 3500, + payload: { + type: "acpx.tool_call", + name: "read", + toolCallId: "tool_read_01", + status: "completed", + text: "Read 142 lines", + }, + }, + { + offsetMs: 3700, + payload: { + type: "acpx.text_delta", + text: + "The test still references the old `pendingRestart` field. I'll update the assertion to use the renamed `restartScheduled` flag.\n\n", + channel: "output", + }, + }, + { + offsetMs: 4200, + payload: { + type: "acpx.tool_call", + name: "edit", + toolCallId: "tool_edit_02", + status: "running", + input: { + path: "server/src/runtime-state.test.ts", + find: "expect(state.pendingRestart).toBe(true)", + replace: "expect(state.restartScheduled).toBe(true)", + }, + }, + }, + { + offsetMs: 5400, + payload: { + type: "acpx.tool_call", + name: "edit", + toolCallId: "tool_edit_02", + status: "completed", + text: "1 replacement", + }, + }, + { + offsetMs: 5800, + payload: { + type: "acpx.status", + text: "Running vitest for runtime-state.test.ts", + }, + }, + { + offsetMs: 6100, + payload: { + type: "acpx.tool_call", + name: "command", + toolCallId: "tool_run_03", + status: "running", + input: { command: "pnpm exec vitest run server/src/runtime-state.test.ts" }, + }, + }, + { + offsetMs: 9100, + payload: { + type: "acpx.tool_call", + name: "command", + toolCallId: "tool_run_03", + status: "completed", + text: + "Test Files 1 passed (1)\nTests 6 passed (6)\nDuration 2.31s", + }, + }, + { + offsetMs: 9400, + payload: { + type: "acpx.text_delta", + text: + "**Test passes.** Updated `runtime-state.test.ts` to assert against `restartScheduled` instead of the renamed `pendingRestart` field.\n\n", + channel: "output", + }, + }, + { + offsetMs: 9600, + payload: { + type: "acpx.text_delta", + text: + "Next I'll update the issue with a summary and hand it back to QA for verification.", + channel: "output", + }, + }, + { + offsetMs: 9800, + payload: { + type: "acpx.status", + tag: "context_window", + used: 18450, + size: 200000, + }, + }, + { + offsetMs: 10000, + payload: { + type: "acpx.result", + summary: "completed", + stopReason: "end_turn", + inputTokens: 18450, + outputTokens: 412, + cachedTokens: 12000, + costUsd: 0.024, + subtype: "end_turn", + }, + }, + ]), + [], + ); +} + +function AcpxLocalTranscriptStory() { + const entries = useAcpxTranscript(); + + return ( +
+
+ + UX preview + +

Run transcript — acpx_local streamed events

+

+ Demonstrates how a streamed acpx_local run renders through the existing transcript pipeline. Events flow + through parseAcpxStdoutLine (session init, thought delta, assistant delta, tool call/result + pairs, context window status, final result) and into RunTranscriptView in nice mode. +

+
+ + + + Run Transcript (nice mode) +

+ Streaming, comfortable density. Mirrors the agent detail page transcript surface. +

+
+ + + +
+ + + + Run Transcript (compact density) +

+ Same parsed events, compact density — matches the live-run widget on the issue thread. +

+
+ + + +
+
+ ); +} + +const SKILLS_COMPANY_ID = "company-storybook"; + +const acpxSkillsCompanyLibrary: CompanySkillListItem[] = [ + { + id: "skill-paperclip", + companyId: SKILLS_COMPANY_ID, + key: "paperclip", + slug: "paperclip", + name: "Paperclip", + description: + "Coordination skill: heartbeats, checkout, comments, and routine API patterns for Paperclip agents.", + sourceType: "local_path", + sourceLocator: "skills/paperclip", + sourceRef: null, + trustLevel: "scripts_executables", + compatibility: "compatible", + fileInventory: [{ path: "SKILL.md", kind: "skill" }], + createdAt: new Date("2026-04-12T09:00:00.000Z"), + updatedAt: new Date("2026-04-22T15:30:00.000Z"), + attachedAgentCount: 4, + editable: false, + editableReason: "Required by Paperclip", + sourceLabel: "Paperclip", + sourceBadge: "paperclip", + sourcePath: "skills/paperclip", + }, + { + id: "skill-design-guide", + companyId: SKILLS_COMPANY_ID, + key: "design-guide", + slug: "design-guide", + name: "Design guide", + description: + "Paperclip UI design system reference: tokens, typography, status colors, and reusable component patterns.", + sourceType: "local_path", + sourceLocator: "skills/design-guide", + sourceRef: null, + trustLevel: "markdown_only", + compatibility: "compatible", + fileInventory: [{ path: "SKILL.md", kind: "skill" }], + createdAt: new Date("2026-04-15T10:00:00.000Z"), + updatedAt: new Date("2026-04-25T12:00:00.000Z"), + attachedAgentCount: 2, + editable: true, + editableReason: null, + sourceLabel: "Local", + sourceBadge: "local", + sourcePath: "skills/design-guide", + }, + { + id: "skill-mobile-qa", + companyId: SKILLS_COMPANY_ID, + key: "mobile-app-qa", + slug: "mobile-app-qa", + name: "Mobile app QA", + description: + "Exploratory QA flows for mobile/web apps using Chrome automation. Captures bugs and writes a final report.", + sourceType: "local_path", + sourceLocator: "skills/mobile-app-qa", + sourceRef: null, + trustLevel: "assets", + compatibility: "compatible", + fileInventory: [{ path: "SKILL.md", kind: "skill" }], + createdAt: new Date("2026-04-18T11:00:00.000Z"), + updatedAt: new Date("2026-04-26T09:30:00.000Z"), + attachedAgentCount: 1, + editable: true, + editableReason: null, + sourceLabel: "Local", + sourceBadge: "local", + sourcePath: "skills/mobile-app-qa", + }, +]; + +function buildAcpxAgent({ + agentId, + acpAgent, + desiredSkills, +}: { + agentId: string; + acpAgent: "claude" | "codex" | "custom"; + desiredSkills: string[]; +}): Agent { + return { + id: agentId, + companyId: SKILLS_COMPANY_ID, + name: `ACPX ${acpAgent === "custom" ? "Custom" : acpAgent === "codex" ? "Codex" : "Claude"}`, + urlKey: `acpx-${acpAgent}`, + role: "engineer", + title: `ACPX ${acpAgent} agent`, + icon: "code", + status: "idle", + reportsTo: null, + capabilities: "Routes work through the ACPX adapter for skill-tagged agent flows.", + adapterType: "acpx_local", + adapterConfig: { + agent: acpAgent, + mode: "persistent", + permissionMode: "approve-all", + paperclipSkillSync: { + desiredSkills, + }, + }, + runtimeConfig: {}, + budgetMonthlyCents: 100_000, + spentMonthlyCents: 0, + pauseReason: null, + pausedAt: null, + permissions: { canCreateAgents: false }, + lastHeartbeatAt: null, + metadata: null, + createdAt: new Date("2026-04-30T12:00:00.000Z"), + updatedAt: new Date("2026-04-30T12:00:00.000Z"), + } as Agent; +} + +function buildAcpxClaudeSnapshot(): AgentSkillSnapshot { + return { + adapterType: "acpx_local", + supported: true, + mode: "ephemeral", + desiredSkills: ["paperclip", "design-guide"], + warnings: [], + entries: [ + { + key: "paperclip", + runtimeName: "paperclip", + desired: true, + managed: true, + required: true, + requiredReason: "Paperclip coordination skill is mandatory for control-plane agents.", + state: "configured", + origin: "paperclip_required", + originLabel: "Required by Paperclip", + readOnly: false, + sourcePath: "skills/paperclip", + targetPath: null, + detail: "Will be mounted into the next ACPX Claude session.", + }, + { + key: "design-guide", + runtimeName: "design-guide", + desired: true, + managed: true, + required: false, + state: "configured", + origin: "company_managed", + originLabel: "Managed by Paperclip", + readOnly: false, + sourcePath: "skills/design-guide", + targetPath: null, + detail: "Will be mounted into the next ACPX Claude session.", + }, + { + key: "mobile-app-qa", + runtimeName: "mobile-app-qa", + desired: false, + managed: true, + required: false, + state: "available", + origin: "company_managed", + originLabel: "Managed by Paperclip", + readOnly: false, + sourcePath: "skills/mobile-app-qa", + targetPath: null, + detail: null, + }, + ], + }; +} + +function buildAcpxCodexSnapshot(): AgentSkillSnapshot { + return { + adapterType: "acpx_local", + supported: true, + mode: "ephemeral", + desiredSkills: ["paperclip"], + warnings: [], + entries: [ + { + key: "paperclip", + runtimeName: "paperclip", + desired: true, + managed: true, + required: true, + requiredReason: "Paperclip coordination skill is mandatory for control-plane agents.", + state: "configured", + origin: "paperclip_required", + originLabel: "Required by Paperclip", + readOnly: false, + sourcePath: "skills/paperclip", + targetPath: null, + detail: "Will be linked into the effective CODEX_HOME/skills/ directory for the next ACPX Codex session.", + }, + { + key: "design-guide", + runtimeName: "design-guide", + desired: false, + managed: true, + required: false, + state: "available", + origin: "company_managed", + originLabel: "Managed by Paperclip", + readOnly: false, + sourcePath: "skills/design-guide", + targetPath: null, + detail: null, + }, + { + key: "mobile-app-qa", + runtimeName: "mobile-app-qa", + desired: false, + managed: true, + required: false, + state: "available", + origin: "company_managed", + originLabel: "Managed by Paperclip", + readOnly: false, + sourcePath: "skills/mobile-app-qa", + targetPath: null, + detail: null, + }, + ], + }; +} + +function buildAcpxCustomSnapshot(): AgentSkillSnapshot { + return { + adapterType: "acpx_local", + supported: false, + mode: "unsupported", + desiredSkills: ["design-guide"], + warnings: [ + "Custom ACP commands do not expose a Paperclip skill integration contract yet; selected skills are tracked only.", + ], + entries: [ + { + key: "paperclip", + runtimeName: "paperclip", + desired: false, + managed: true, + required: true, + requiredReason: "Paperclip coordination skill is mandatory for control-plane agents.", + state: "available", + origin: "paperclip_required", + originLabel: "Required by Paperclip", + readOnly: false, + sourcePath: "skills/paperclip", + targetPath: null, + detail: null, + }, + { + key: "design-guide", + runtimeName: "design-guide", + desired: true, + managed: true, + required: false, + state: "configured", + origin: "company_managed", + originLabel: "Managed by Paperclip", + readOnly: false, + sourcePath: "skills/design-guide", + targetPath: null, + detail: + "Desired state is stored in Paperclip only; custom ACP commands need an explicit skill integration contract before runtime sync is available.", + }, + { + key: "mobile-app-qa", + runtimeName: "mobile-app-qa", + desired: false, + managed: true, + required: false, + state: "available", + origin: "company_managed", + originLabel: "Managed by Paperclip", + readOnly: false, + sourcePath: "skills/mobile-app-qa", + targetPath: null, + detail: null, + }, + ], + }; +} + +function StoryFrame({ + title, + subtitle, + children, +}: { + title: string; + subtitle: string; + children: ReactNode; +}) { + return ( +
+
+ + UX preview + +

{title}

+

{subtitle}

+
+ + + + Agent detail — Skills tab + + {children} + +
+ ); +} + +function AcpxSkillsState({ + agent, + snapshot, + library, +}: { + agent: Agent; + snapshot: AgentSkillSnapshot; + library: CompanySkillListItem[]; +}) { + const queryClient = useQueryClient(); + queryClient.setQueryData(queryKeys.companySkills.list(SKILLS_COMPANY_ID), library); + queryClient.setQueryData(queryKeys.agents.skills(agent.id), snapshot); + return ; +} + +function AcpxClaudeSkillsStory() { + const agent = buildAcpxAgent({ + agentId: "agent-acpx-claude", + acpAgent: "claude", + desiredSkills: ["paperclip", "design-guide"], + }); + return ( + + + + ); +} + +function AcpxCodexSkillsStory() { + const agent = buildAcpxAgent({ + agentId: "agent-acpx-codex", + acpAgent: "codex", + desiredSkills: ["paperclip"], + }); + return ( + + + + ); +} + +function AcpxCustomSkillsStory() { + const agent = buildAcpxAgent({ + agentId: "agent-acpx-custom", + acpAgent: "custom", + desiredSkills: ["design-guide"], + }); + return ( + + + + ); +} + +function AcpxClaudeSkillsLoadingStory() { + const agent = buildAcpxAgent({ + agentId: "agent-acpx-claude-loading", + acpAgent: "claude", + desiredSkills: [], + }); + return ( + + + + ); +} + +function AcpxClaudeSkillsEmptyLibraryStory() { + const agent = buildAcpxAgent({ + agentId: "agent-acpx-claude-empty", + acpAgent: "claude", + desiredSkills: [], + }); + const emptySnapshot: AgentSkillSnapshot = { + adapterType: "acpx_local", + supported: true, + mode: "ephemeral", + desiredSkills: [], + warnings: [], + entries: [], + }; + return ( + + + + ); +} + +const meta: Meta = { + title: "Adapters / acpx_local", + parameters: { + layout: "fullscreen", + }, +}; + +export default meta; + +export const ConfigForm: StoryObj = { + name: "Agent config form", + render: () => , +}; + +export const Transcript: StoryObj = { + name: "Streamed run transcript", + render: () => , +}; + +export const SkillsTabClaude: StoryObj = { + name: "Skills tab — ACPX Claude", + render: () => , +}; + +export const SkillsTabCodex: StoryObj = { + name: "Skills tab — ACPX Codex", + render: () => , +}; + +export const SkillsTabCustom: StoryObj = { + name: "Skills tab — ACPX custom (unsupported)", + render: () => , +}; + +export const SkillsTabLoading: StoryObj = { + name: "Skills tab — loading", + render: () => , +}; + +export const SkillsTabEmptyLibrary: StoryObj = { + name: "Skills tab — empty company library", + render: () => , +}; diff --git a/vitest.config.ts b/vitest.config.ts index c886095d..85fd42d4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ "packages/shared", "packages/db", "packages/adapter-utils", + "packages/adapters/acpx-local", "packages/adapters/claude-local", "packages/adapters/codex-local", "packages/adapters/cursor-local",

_2V*tYN2OWXz=(^8;G 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 z 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 F{TF~Uf#(1K literal 0 HcmV?d00001 diff --git a/docs/pr-screenshots/pap-2944/skills-custom-light.png b/docs/pr-screenshots/pap-2944/skills-custom-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9873a1ed13d518acf90fa2add69648a9d9142b GIT binary patch literal 89232 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